# Tajo — full content
> Tajo is an integration builder run by AI agents. Describe a sync between two SaaS tools in plain language. The agent builds the field map, the reverse ETL job and the MCP tools that run it. You approve each change before it goes live.
This file is the companion to https://tajo.io/llms.txt. That file lists where
things are; this one contains the writing itself, so a model can read Tajo's
documentation, help articles, and research without crawling 589 pages.
Generated 2026-10-24 from the site source.
Scope and caveats:
- English only. The other 30 locales are translations of this same corpus;
hreflang annotations and https://tajo.io/sitemap-index.xml point to every
localized URL.
- The live pages are canonical. This file is a snapshot taken at build time.
- Diagrams and interactive figures are omitted; their surrounding prose is
not. Decision trees and message sequences are rendered as text.
- Marketing and product pages are not included here — they are short and are
linked from llms.txt.
Contents: 77 documentation pages, 24 help articles, 488 articles.
---
# Documentation
## Analytics & Reporting
Source: https://tajo.io/docs/analytics-reporting/
Track and analyze your email and SMS campaigns
Get detailed insights into your email campaigns, SMS delivery, and contact engagement.
### Email Campaign Statistics
```javascript
const campaignId = 123;
const stats = await brevo.emailCampaigns.getEmailCampaign(campaignId);
console.log(stats.statistics);
```
### Contact Activity
```javascript
const contact = await brevo.contacts.getContactInfo("user@example.com");
console.log(contact.emailBlacklisted, contact.smsBlacklisted);
```
### Available Metrics
- Open rates
- Click-through rates
- Bounce rates
- Unsubscribe rates
- Delivery statistics
- Contact engagement history
### Frequently asked questions
**What metrics can I get for my Brevo email campaigns?**
Open rates, click-through rates, bounce rates, unsubscribe rates, delivery statistics and contact engagement history. Fetch a campaign's statistics with brevo.emailCampaigns.getEmailCampaign(campaignId) and read its statistics field.
**How do I check whether a contact is blacklisted for email or SMS?**
Call brevo.contacts.getContactInfo with the contact's email and read the emailBlacklisted and smsBlacklisted fields on the returned contact.
**How do I get statistics for one email campaign through the Brevo API?**
Call getEmailCampaign with the campaign id; the response carries a statistics object with the campaign's open, click, bounce, unsubscribe and delivery figures.
---
## API Keys
Source: https://tajo.io/docs/authentication/api-keys/
Complete guide to API key authentication with Brevo
API keys are the primary method for authenticating with the Brevo API. They provide a simple and secure way to access your account programmatically.
### What are API Keys?
API keys are unique identifiers that authenticate your application when making requests to the Brevo API. Each key is a 64-character string that serves as both an identifier and a password.
```
Example API key: xkeysib-a1b2c3d4e5f6789012345678901234567890abcdef1234567890abcdef123456-Ab1Cd2Ef3Gh4
```
### Generating API Keys
#### Step-by-Step Guide
1. **Log into Brevo**: Access your [Brevo dashboard](https://app.brevo.com)
2. **Navigate to Settings**: Click on your profile → Settings
3. **Go to API Keys**: Select "API Keys" from the left menu
4. **Create New Key**: Click "Generate a New API Key"
5. **Name Your Key**: Give it a descriptive name (e.g., "Production App", "Development Testing")
6. **Set Permissions**: Choose the appropriate access level
7. **Generate**: Click "Generate" and copy the key immediately
#### API Key Naming Conventions
Use descriptive names that help you identify the key's purpose:
- `production-web-app`
- `staging-environment`
- `mobile-app-ios`
- `webhook-listener`
- `data-sync-service`
### API Key Types and Permissions
#### Full Access Keys
```
Permissions: All API endpoints
Use cases: Complete application integration
Risk level: High - protect carefully
```
#### Read-Only Keys
```
Permissions: GET requests only
Use cases: Analytics, reporting, dashboards
Risk level: Low - limited access
```
#### Send-Only Keys
```
Permissions: Transactional email sending
Use cases: Application notifications, receipts
Risk level: Medium - can send emails
```
#### Contact Management Keys
```
Permissions: Contact CRUD operations
Use cases: CRM integrations, form submissions
Risk level: Medium - data modification
```
### Using API Keys
#### Header Authentication
Include your API key in the `api-key` header:
```http
GET /v3/account HTTP/1.1
Host: api.brevo.com
Accept: application/json
Content-Type: application/json
api-key: YOUR_API_KEY
```
#### Code Examples
##### JavaScript/Node.js
```javascript
const brevo = require('@getbrevo/brevo');
const apiInstance = new brevo.AccountApi();
apiInstance.setApiKey(brevo.AccountApiApiKeys.apiKey, process.env.BREVO_API_KEY);
// Make authenticated request
apiInstance.getAccount()
.then(data => console.log('Account info:', data))
.catch(error => console.error('Error:', error));
```
##### Python
```python
import sib_api_v3_sdk
from sib_api_v3_sdk.rest import ApiException
# Configure API key
configuration = sib_api_v3_sdk.Configuration()
configuration.api_key['api-key'] = 'YOUR_API_KEY'
# Create API instance
api_instance = sib_api_v3_sdk.AccountApi(sib_api_v3_sdk.ApiClient(configuration))
try:
# Get account info
api_response = api_instance.get_account()
print(api_response)
except ApiException as e:
print("Exception when calling AccountApi->get_account: %s\n" % e)
```
##### PHP
```php
setApiKey('api-key', 'YOUR_API_KEY');
// Create API instance
$apiInstance = new SendinBlue\Client\Api\AccountApi(
new GuzzleHttp\Client(),
$config
);
try {
$result = $apiInstance->getAccount();
print_r($result);
} catch (Exception $e) {
echo 'Exception when calling AccountApi->getAccount: ', $e->getMessage(), PHP_EOL;
}
?>
```
##### Ruby
```ruby
require 'sib-api-v3-sdk'
# Configure API key
SibApiV3Sdk.configure do |config|
config.api_key['api-key'] = 'YOUR_API_KEY'
end
# Create API instance
api_instance = SibApiV3Sdk::AccountApi.new
begin
# Get account info
result = api_instance.get_account
puts result
rescue SibApiV3Sdk::ApiError => e
puts "Exception when calling AccountApi->get_account: #{e}"
end
```
### API Key Security
#### Secure Storage
**Environment Variables** (Recommended)
```bash
# .env file
BREVO_API_KEY=xkeysib-your-api-key-here
# Usage in code
const apiKey = process.env.BREVO_API_KEY;
```
**Cloud Secret Managers**
- AWS Secrets Manager
- Google Secret Manager
- Azure Key Vault
- HashiCorp Vault
#### Security Best Practices
1. **Never Hardcode Keys**
```javascript
// ❌ Bad - hardcoded
const apiKey = "xkeysib-a1b2c3d4...";
// ✅ Good - environment variable
const apiKey = process.env.BREVO_API_KEY;
```
2. **Use Different Keys per Environment**
```
Production: BREVO_API_KEY_PROD
Staging: BREVO_API_KEY_STAGING
Development: BREVO_API_KEY_DEV
```
3. **Rotate Keys Regularly**
- Set calendar reminders for quarterly rotation
- Use automation tools for key rotation
- Have a rollback plan ready
4. **Monitor Key Usage**
- Set up alerts for unusual activity
- Review key usage logs monthly
- Track geographic access patterns
### Key Management
#### Active Key Monitoring
Monitor your active keys in the dashboard:
```
Key Name: production-web-app
Created: 2024-01-15
Last Used: 2024-01-20 14:30 UTC
Requests Today: 1,247
Status: Active
```
#### Key Rotation Process
1. **Generate New Key**: Create replacement key
2. **Update Configuration**: Deploy with new key
3. **Monitor**: Ensure new key works correctly
4. **Grace Period**: Keep old key active for 24-48 hours
5. **Revoke Old Key**: Delete the previous key
#### Emergency Key Revocation
If a key is compromised:
1. **Immediate Revocation**: Delete key from dashboard
2. **Generate Replacement**: Create new key immediately
3. **Update Applications**: Deploy with new key ASAP
4. **Monitor Activity**: Check for unauthorized usage
5. **Incident Report**: Document the security incident
### Rate Limiting and API Keys
Brevo limits requests per endpoint, not per day. On the general tier, which every plan gets, `POST /v3/smtp/email` allows 1,000 requests per second, the `/v3/contacts` endpoints allow 10 per second and 36,000 per hour, and endpoints without their own limit allow 100 per hour. Professional and Enterprise plans unlock higher tiers. See [Rate limits](/docs/rate-limits/) for the full table.
#### Rate Limit Headers
```http
HTTP/1.1 200 OK
x-sib-ratelimit-limit: 1000
x-sib-ratelimit-remaining: 750
x-sib-ratelimit-reset: 1
```
#### Handling Rate Limits
```javascript
async function makeApiCall() {
try {
const response = await fetch(url, { headers });
if (response.status === 429) {
// Seconds until the window resets
const waitTime = Number(response.headers.get('x-sib-ratelimit-reset') || 1);
console.log(`Rate limited. Waiting ${waitTime} seconds`);
await new Promise(resolve => setTimeout(resolve, waitTime * 1000));
// Retry the request
return makeApiCall();
}
return response.json();
} catch (error) {
console.error('API call failed:', error);
throw error;
}
}
```
### Troubleshooting API Keys
#### Common Error Messages
**Invalid API Key (401)**
```json
{
"code": "unauthorized",
"message": "Invalid API key provided"
}
```
**Insufficient Permissions (403)**
```json
{
"code": "permission_denied",
"message": "API key does not have required permissions"
}
```
**Rate Limit Exceeded (429)**
```json
{
"code": "too_many_requests",
"message": "Rate limit exceeded for API key"
}
```
#### Debugging Checklist
- [ ] Key is correctly formatted (64 characters)
- [ ] No extra spaces or hidden characters
- [ ] Key has required permissions
- [ ] Key is active (not revoked)
- [ ] Within rate limits
- [ ] Using correct API endpoint
- [ ] Headers properly formatted
### Next Steps
- [Learn about OAuth 2.0](/docs/authentication/oauth/)
- Understand JWT tokens
- [Explore rate limits](/docs/rate-limits/)
- [Try the SDKs](/docs/sdks-libraries/)
### Frequently asked questions
**What does a Brevo API key look like?**
A 64-character string starting with xkeysib- that serves as both identifier and password for your application. Each key has a name and a permission level.
**How do I create a Brevo API key with limited permissions?**
In the Brevo dashboard go to Settings, API Keys, click Generate a New API Key, name it, and set the access level: full access, read-only for GET requests, send-only for transactional email, or contact management for contact operations. Copy the key immediately.
**How do I use a Brevo API key in Python, PHP or Ruby?**
Set the api-key value on the SDK configuration: configuration.api_key['api-key'] in the Python sib_api_v3_sdk, setApiKey('api-key', ...) on the PHP SendinBlue client configuration, and config.api_key['api-key'] in the Ruby sib-api-v3-sdk, then call AccountApi get_account to verify.
**Where should I store my Brevo API key?**
In an environment variable such as BREVO_API_KEY or a cloud secret manager like AWS Secrets Manager, Google Secret Manager, Azure Key Vault or HashiCorp Vault. Never hardcode it, use a different key per environment, rotate quarterly and monitor usage.
**What should I do if my Brevo API key is compromised?**
Delete the key from the dashboard immediately, generate a replacement, deploy it to your applications as soon as possible, check for unauthorized usage, and document the incident.
---
## Authentication Overview
Source: https://tajo.io/docs/authentication/
Brevo connector: authentication methods of the Brevo API (API keys, OAuth 2.0, JWT tokens)
Brevo API supports multiple authentication methods to secure your API requests.
### Authentication Methods
#### API Keys
The most common method for server-to-server communication.
- [Get your API key](/docs/authentication/api-keys)
- Simple and straightforward
- Perfect for backend integrations
#### OAuth 2.0
For applications that need user authorization.
- [OAuth 2.0 setup guide](/docs/authentication/oauth)
- Secure user consent flow
- Ideal for third-party applications
#### JWT Tokens
For advanced authentication scenarios.
- [JWT implementation guide](/docs/authentication/jwt-tokens)
- Stateless authentication
- Enhanced security features
### Security Best Practices
1. **Never expose API keys in client-side code**
2. **Use environment variables for sensitive data**
3. **Rotate keys regularly**
4. **Implement proper error handling**
5. **Use HTTPS for all requests**
### Rate Limiting
All authentication methods are subject to rate limiting:
- **Free accounts**: 300 requests/hour
- **Paid accounts**: 3000 requests/hour
- **Enterprise**: Custom limits available
### Frequently asked questions
**What authentication methods does the Brevo API support?**
Three: API keys, the most common method for server-to-server calls and backend integrations; OAuth 2.0 for applications that need user authorization; and JWT tokens for stateless, advanced scenarios.
**Which Brevo authentication method should I use?**
An API key for backend integrations, OAuth 2.0 when a third-party application needs a user's consent, and JWT tokens for stateless authentication with enhanced security.
**What are the security best practices for Brevo API keys?**
Never expose keys in client-side code, keep them in environment variables, rotate them regularly, handle errors properly, and use HTTPS for every request.
---
## JWT Tokens
Source: https://tajo.io/docs/authentication/jwt-tokens/
JSON Web Tokens for secure API authentication
JSON Web Tokens (JWT) provide a secure method for transmitting information between parties as a JSON object.
### JWT Structure
A JWT consists of three parts separated by dots:
```
header.payload.signature
```
#### Header
```json
{
"alg": "HS256",
"typ": "JWT"
}
```
#### Payload
```json
{
"sub": "1234567890",
"email": "user@example.com",
"iat": 1516239022,
"exp": 1516242622
}
```
#### Signature
The signature is created using:
```
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
```
### Creating JWT Tokens
#### Node.js Example
```javascript
const jwt = require('jsonwebtoken');
const payload = {
userId: '12345',
email: 'user@example.com',
scope: ['email', 'contacts']
};
const token = jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: '1h',
issuer: 'your-app',
audience: 'brevo-api'
});
```
#### Python Example
```python
import jwt
import datetime
payload = {
'user_id': '12345',
'email': 'user@example.com',
'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1),
'iat': datetime.datetime.utcnow()
}
token = jwt.encode(payload, 'your-secret-key', algorithm='HS256')
```
### Using JWT with Brevo API
```bash
curl -X GET "https://api.brevo.com/v3/account" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
-H "Accept: application/json"
```
### Token Validation
```javascript
const validateToken = (token) => {
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
return { valid: true, payload: decoded };
} catch (error) {
return { valid: false, error: error.message };
}
};
```
### Best Practices
- Use strong, random secrets
- Set appropriate expiration times
- Validate tokens on every request
- Use HTTPS only
- Store secrets securely
- Implement token refresh logic
### Frequently asked questions
**What are the three parts of a JWT's structure?**
Three base64url-encoded parts separated by dots: a header naming the algorithm such as HS256, a payload with claims such as sub, email, iat and exp, and a signature computed as HMACSHA256 over the encoded header and payload with a secret.
**How do I create a JWT for the Brevo API in Node.js?**
Use the jsonwebtoken package: jwt.sign with a payload such as userId, email and scope, your secret from process.env.JWT_SECRET, and options expiresIn of 1h, an issuer and the audience brevo-api.
**How do I send a JWT to the Brevo API?**
Put it in the Authorization header as a Bearer token, for example on GET https://api.brevo.com/v3/account with Accept: application/json.
**How do I validate a JWT?**
Call jwt.verify with the token and your secret inside a try block; a valid token returns its decoded payload, an invalid or expired one throws.
**What are the best practices for JWT secrets, expiry and validation?**
Use strong random secrets, set appropriate expiration times, validate tokens on every request, use HTTPS only, store secrets securely, and implement token refresh logic.
---
## OAuth 2.0
Source: https://tajo.io/docs/authentication/oauth/
OAuth 2.0 authentication for secure third-party integrations
OAuth 2.0 provides secure, token-based authentication for third-party applications accessing Brevo on behalf of users.
### OAuth Flow Overview
1. **Authorization Request**: Redirect user to Brevo
2. **User Authorization**: User grants permissions
3. **Authorization Code**: Brevo redirects with code
4. **Access Token Exchange**: Exchange code for tokens
5. **API Access**: Use access token for requests
### Authorization Endpoint
```
https://app.brevo.com/oauth/authorize?
response_type=code&
client_id=YOUR_CLIENT_ID&
redirect_uri=YOUR_REDIRECT_URI&
scope=email%20contacts&
state=random_string
```
### Token Exchange
```bash
curl -X POST "https://api.brevo.com/v3/oauth/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code&code=AUTH_CODE&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&redirect_uri=YOUR_REDIRECT_URI"
```
### Access Token Usage
```javascript
const response = await fetch('https://api.brevo.com/v3/account', {
headers: {
'Authorization': 'Bearer YOUR_ACCESS_TOKEN',
'Accept': 'application/json'
}
});
```
### Scopes
- `email`: Send transactional emails
- `contacts`: Manage contacts and lists
- `campaigns`: Create and send campaigns
- `sms`: Send SMS messages
- `webhooks`: Manage webhooks
### Token Refresh
```javascript
const refreshToken = async () => {
const response = await fetch('https://api.brevo.com/v3/oauth/token', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'refresh_token',
refresh_token: 'YOUR_REFRESH_TOKEN',
client_id: 'YOUR_CLIENT_ID',
client_secret: 'YOUR_CLIENT_SECRET'
})
});
return response.json();
};
```
### Frequently asked questions
**What are the steps of the OAuth 2.0 flow with Brevo?**
Five steps: redirect the user to Brevo's authorization endpoint, the user grants permissions, Brevo redirects back with an authorization code, you exchange the code for tokens at the token endpoint, then you call the API with the access token.
**Which OAuth scopes does Brevo offer?**
Five scopes: email to send transactional emails, contacts to manage contacts and lists, campaigns to create and send campaigns, sms to send SMS messages, and webhooks to manage webhooks.
**How do I exchange an OAuth authorization code for a Brevo access token?**
POST to https://api.brevo.com/v3/oauth/token as form data with grant_type=authorization_code, the code, your client_id, client_secret and redirect_uri.
**How do I use a Brevo OAuth access token in API calls?**
Send it in the Authorization header as Bearer YOUR_ACCESS_TOKEN, with Accept: application/json, for example on GET https://api.brevo.com/v3/account.
**How do I refresh an expired Brevo OAuth token?**
POST to https://api.brevo.com/v3/oauth/token with grant_type=refresh_token, your refresh_token, client_id and client_secret; the response carries the new tokens.
---
## Authentication Overview
Source: https://tajo.io/docs/authentication/overview/
Overview of authentication methods
**Demo Page** - This is a demo page to showcase the multi-tab documentation feature. This content is for illustration purposes only.
This guide explains how to authenticate with our API. We support several authentication methods:
### API Keys
The simplest authentication method is to use API keys. Each API key is associated with a specific user and has specific permissions.
```javascript
// Example API Key request
const response = await fetch('https://api.example.com/data', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY'
}
});
```
### OAuth 2.0
For more secure applications, we support OAuth 2.0 authentication flow:
1. **Authorization Request**: Redirect users to our authorization URL
2. **User Consent**: User approves access to their account
3. **Authorization Code**: Our server returns an authorization code
4. **Token Exchange**: Exchange the code for an access token
5. **API Requests**: Use the access token to access protected resources
### JWT Tokens
After authentication, we issue JWT tokens that contain encoded information about the user and their permissions.
```javascript
// Example JWT token usage
const response = await fetch('https://api.example.com/protected-resource', {
headers: {
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'
}
});
```
### Session Management
Sessions are valid for 24 hours by default. To refresh a session:
```javascript
const refreshResponse = await fetch('https://api.example.com/auth/refresh', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer CURRENT_REFRESH_TOKEN'
}
});
// Parse the new tokens
const { accessToken, refreshToken } = await refreshResponse.json();
```
### Best Practices
1. Never store API keys or tokens in client-side code
2. Use environment variables for sensitive credentials
3. Implement token refresh mechanisms for long-running applications
4. Set appropriate token expiration times
5. Use HTTPS for all API requests
---
## Automation
Source: https://tajo.io/docs/automation/
Automate customer engagement with Tajo's three-layer architecture: Skills for deterministic workflows, Agents for AI-powered orchestration, and natural language for intent-driven marketing.
Tajo provides three levels of automation for customer engagement, from simple rule-based workflows to fully autonomous AI agents.
### Three Layers of Automation
#### 1. Skills, Deterministic Workflows
Skills are atomic, rule-based automation units. They execute the same way every time: a trigger fires, conditions are checked, actions run.
```yaml
triggers:
- event: cart_abandoned
conditions:
- cart_value: "> 50"
- time_since_activity: "> 30m"
actions:
- brevo/send-email:
template_id: 101
to: "{{ contact.email }}"
```
**Best for:** Repeatable processes, cart recovery, welcome sequences, data sync, order confirmations.
[Browse Skills](/docs/skills) | [Skills Format](/docs/skills/overview/skills-format/)
#### 2. Agents, AI-Powered Orchestration
Agents use LLMs to reason about goals, select tools, and adapt strategy. They compose multiple Skills and Brevo MCP tools to achieve complex marketing objectives.
```yaml
---
name: win-back-agent
tools:
- brevo_contacts
- brevo_segments
- brevo_email_campaign_management
- brevo_sms_campaigns
---
# Win-Back Agent
Analyze churned customers, design personalized re-engagement
sequences based on purchase history, and execute across
the optimal channel mix.
```
**Best for:** Complex decisions, choosing channels, personalizing offers, adapting sequences based on customer behavior.
[Build an Agent](/docs/mcp/building-agents) | [Agent Specification](/docs/mcp/agent-specification)
#### 3. Natural Language, Intent-Driven Marketing
The top layer translates marketer intent into agent actions:
> "Create a VIP appreciation campaign for customers who spent over $500 this quarter. Use email with a personal thank-you and an exclusive 20% discount code."
The orchestration layer selects the right agent, which composes the right skills and Brevo MCP tools to execute.
[MCP Architecture](/docs/mcp)
### Choosing the Right Level
| Question | Use Skills | Use Agents |
|----------|-----------|------------|
| Is the logic the same every time? | Yes | |
| Does it require judgment calls? | | Yes |
| Single trigger → single action? | Yes | |
| Multi-step with branching logic? | | Yes |
| Needs to adapt to customer behavior? | | Yes |
| High-volume, latency-sensitive? | Yes | |
| Needs human-readable audit trail? | Both | Both |
### How They Work Together
In practice, agents invoke skills as part of their execution:
```
Marketer: "Set up cart recovery for the holiday season"
↓
Agent: Reads context, decides on strategy
↓
Agent calls Skill: tajo/recover-abandoned-cart (configured for holidays)
Agent calls Skill: tajo/customer-sync (ensure data is fresh)
Agent calls MCP: brevo_segments (create holiday shopper segment)
Agent calls MCP: brevo_templates (check holiday email templates exist)
↓
Result: Cart recovery active with holiday-specific messaging
```
### Triggers
Both Skills and Agents support three trigger types:
#### Event Triggers
React to something happening in your system:
```yaml
triggers:
- event: order_completed
- event: customer_created
- event: cart_abandoned
```
#### Schedule Triggers
Run on a recurring schedule:
```yaml
triggers:
- schedule: "0 9 * * MON" # Every Monday at 9am
- schedule: "0 */4 * * *" # Every 4 hours
```
#### Webhook Triggers
Invoke via HTTP request:
```yaml
triggers:
- webhook: /automation/cart-recovery/trigger
method: POST
```
### Brevo MCP Integration
All automation runs through Brevo's official MCP server, which exposes 27 modules as AI-callable tools. Tajo agents connect to the specific modules they need:
| Module | What It Does |
|--------|-------------|
| `brevo_contacts` | Manage contacts and lists |
| `brevo_email_campaign_management` | Create and send email campaigns |
| `brevo_sms_campaigns` | SMS campaigns |
| `brevo_whatsapp_campaigns` | WhatsApp campaigns |
| `brevo_segments` | Dynamic contact segments |
| `brevo_campaign_analytics` | Campaign performance data |
| `brevo_deals` | CRM deal management |
[Full server list](/docs/mcp/brevo-mcp-server#individual-servers)
### Next Steps
- [Brevo MCP Server Setup](/docs/mcp/brevo-mcp-server), Connect Brevo's 27 MCP modules
- [Building Your First Agent](/docs/mcp/building-agents), Hands-on tutorial
- [Skills Reference](/docs/skills), Browse available automation skills
- [Agent Specification](/docs/mcp/agent-specification), Define custom agents
### Frequently asked questions
**What are the three layers of automation in Tajo?**
Skills, deterministic rule-based workflows that run the same way every time; Agents, which use LLMs to reason about goals, select tools and compose Skills and Brevo MCP tools; and natural language, where a marketer's intent is translated into agent actions.
**What is the difference between Skills and Agents in Tajo, and when do I use each?**
Use a Skill when the logic is the same every time, a single trigger leads to a single action, or the work is high-volume and latency-sensitive: cart recovery, welcome sequences, data sync, order confirmations. Use an Agent for judgment calls, branching multi-step logic, and adapting to customer behavior.
**What kinds of triggers can start a Tajo automation, Skill or Agent?**
Three types: event triggers such as order_completed, customer_created and cart_abandoned; schedule triggers written as cron expressions; and webhook triggers invoked by an HTTP request to a path such as /automation/cart-recovery/trigger.
**How do Tajo agents use Brevo?**
All automation runs through Brevo's official MCP server, which exposes 27 modules as AI-callable tools, such as brevo_contacts, brevo_email_campaign_management, brevo_sms_campaigns, brevo_whatsapp_campaigns, brevo_segments, brevo_campaign_analytics and brevo_deals. An agent connects only to the modules it needs.
**How do Skills and Agents work together in Tajo?**
An agent reads the context, decides a strategy, then calls Skills such as tajo/recover-abandoned-cart and tajo/customer-sync and Brevo MCP tools such as brevo_segments and brevo_templates to carry it out. Both keep a human-readable audit trail.
---
## Data Protection & Privacy
Source: https://tajo.io/docs/compliance/data-protection/
Comprehensive data protection details and compliance information for the Tajo platform
This document outlines how Tajo handles personal data for merchants' customers, prospective customers, and visitors to merchant sites. Our commitment to data protection ensures compliance with GDPR, CCPA, and other global privacy regulations.
### Purpose & Data Minimization
#### Do you process the minimum personal data required to provide value to merchants?
**Yes.** Tajo processes only the essential personal data required to:
- Synchronize customer information with Brevo for marketing automation
- Enable loyalty program functionality
- Track customer orders and engagement
- Provide multi-channel communication capabilities
Personal data includes information that can identify a unique person (name, email address) or be linked back to a unique person (order total, customer ID).
#### Do you tell merchants the personal data that you process and your purposes for processing it?
**Yes.** We provide complete transparency through:
- Our Data Processing Agreement (DPA) that clearly defines all data categories processed
- Documentation specifying exactly what data is synchronized to Brevo
- Clear API documentation showing all data fields transmitted
- Real-time visibility into data synchronization activities
#### Do you limit your use of personal data to that purpose?
**Yes.** Tajo strictly uses personal data only for:
- Providing the core platform services as described in our Terms of Service
- Synchronizing customer data with Brevo for marketing automation
- Operating loyalty programs and customer engagement features
- Generating analytics and insights for merchants
We do not use customer data for any purposes beyond those explicitly stated and agreed upon.
### Consent & Legal Basis
#### Do you have privacy and data protection agreements with your merchants?
**Yes.** Every merchant must accept our:
- **Terms of Service** - Governing the use of Tajo platform
- **Data Processing Agreement (DPA)** - Defining our role as data processor
- **Privacy Policy** - Outlining our data handling practices
These agreements establish:
- Tajo acts as a **Processor** for merchant customer data
- Merchants act as **Controllers** and are responsible for obtaining proper consent
- Clear obligations for both parties regarding data protection
#### Do you respect and apply customers' consent decisions?
**Yes.** Tajo respects customer consent through:
- Automatic processing of unsubscribe requests from Brevo
- Real-time synchronization of consent preferences
- Suppression of communications to customers who have opted out
- Honoring customer preferences across all channels (email, SMS, WhatsApp)
When a customer unsubscribes or withdraws consent, Tajo immediately:
1. Syncs the preference to Brevo
2. Prevents future marketing communications
3. Maintains audit logs of consent changes
#### Do you respect and apply customers' decisions to opt-out of having their data sold?
**Yes.** Tajo does not sell customer data under any circumstances. We:
- Never share personal data with third parties for commercial purposes
- Only transmit data to Brevo as part of core platform functionality
- Comply with CCPA "Do Not Sell My Personal Information" requirements
- Maintain clear disclosures that no data selling occurs
#### If you use personal data for automated decision-making and those decisions may have legal or significant effects, can customers opt-out?
**Not Applicable.** Tajo does not perform automated decision-making that has legal or similarly significant effects on individuals. The platform provides:
- Marketing automation (which customers can opt out of entirely)
- Loyalty program management (which merchants control)
- Customer segmentation (for merchant use only)
None of these activities constitute automated decision-making with legal or significant effects as defined by GDPR Article 22.
### Storage & Security
#### Do you have retention periods that make sure personal data isn't kept longer than needed?
**Yes.** Tajo implements clear data retention policies:
**Active Customer Data:**
- Retained while the merchant account is active
- Used for ongoing synchronization and platform functionality
- Merchants can delete customer data at any time through the Tajo interface
**Account Termination:**
- All customer data is deleted within 90 days of account termination
- Merchants can request immediate data deletion upon termination
- Backup data is purged according to our backup retention schedule (30 days)
**Legal Retention:**
- Transaction records may be retained longer where required by law (e.g., tax records)
- Minimal data retained for legal compliance purposes only
Merchants are responsible for:
- Managing retention periods for their own data processing activities
- Deleting customer data when no longer needed
- Complying with applicable data protection laws in their jurisdiction
#### Do you encrypt data at rest and in transit?
**Yes.** Tajo employs industry-standard encryption:
**In Transit:**
- TLS 1.3 for all data transmissions
- HTTPS enforced for all web traffic
- Encrypted API connections to Brevo
- Certificate pinning for mobile applications
**At Rest:**
- AES-256 encryption for database storage
- Encrypted backups
- Encrypted file storage for any uploaded documents
- Database-level encryption for sensitive fields (e.g., API keys)
#### Do you encrypt your data backups?
**Yes.** All backup data is encrypted:
- Automated daily backups encrypted with AES-256
- Backup files stored with encryption at rest
- Secure key management for backup encryption keys
- Regular backup restoration tests to verify integrity
#### Do you separate test and production data?
**Yes.** Tajo maintains strict separation:
- Completely separate production and development/test environments
- No production data used in test environments
- Test data anonymized and synthetic
- Separate databases, servers, and access controls
- Different API keys and credentials for each environment
#### Do you have a data loss prevention strategy?
**Yes.** Tajo implements comprehensive data loss prevention:
**Preventive Measures:**
- Automated backups every 24 hours
- Real-time database replication
- Redundant storage across multiple availability zones
- Version control and change tracking
**Detection:**
- Automated monitoring for data integrity
- Anomaly detection for unusual data access patterns
- Regular security audits and penetration testing
- Automated alerts for potential data breaches
**Recovery:**
- Point-in-time recovery capabilities
- Documented disaster recovery procedures
- Regular disaster recovery drills
- RTO (Recovery Time Objective): 4 hours
- RPO (Recovery Point Objective): 24 hours
### Access Control
#### Do you limit staff access to customers' personal data?
**Yes.** Access to customer data is strictly controlled:
**Access Principles:**
- Principle of least privilege
- Role-based access control (RBAC)
- Need-to-know basis only
- Regular access reviews (quarterly)
**Access Levels:**
- **No Access**: Most staff have no access to production customer data
- **Read-Only**: Support staff have limited, audited read access for troubleshooting
- **Administrative**: Database administrators have elevated access, heavily logged
- **Emergency**: Break-glass procedures for critical incidents only
**Controls:**
- Multi-factor authentication (MFA) required for all staff
- VPN required for remote access
- IP allowlisting for administrative access
- Session timeouts and automatic lockouts
#### Do you have strong password requirements for staff passwords?
**Yes.** Tajo enforces enterprise-grade password policies:
**Requirements:**
- Minimum 16 characters
- Must include uppercase, lowercase, numbers, and special characters
- Cannot reuse last 12 passwords
- Password expiration every 90 days
- Account lockout after 5 failed attempts
**Enhanced Security:**
- Multi-factor authentication (MFA) mandatory for all staff
- Single Sign-On (SSO) integration with corporate identity provider
- Biometric authentication supported
- Password manager required for all employees
- Regular security awareness training
#### Do you log access to personal data?
**Yes.** Comprehensive audit logging is maintained:
**Logged Activities:**
- All database queries accessing customer data
- API calls to Brevo with customer information
- Administrative access to production systems
- Data exports and bulk operations
- Configuration changes
- Failed authentication attempts
**Log Details Include:**
- Timestamp of access
- User identity
- IP address and location
- Action performed
- Data accessed (record IDs)
- Success or failure status
**Log Management:**
- Logs retained for 1 year minimum
- Encrypted log storage
- Tamper-proof logging system
- Regular log reviews
- SIEM integration for real-time monitoring
- Automated alerts for suspicious activities
#### Do you have a security incident response policy?
**Yes.** Tajo maintains a comprehensive Security Incident Response Plan:
**Detection & Assessment:**
- 24/7 security monitoring
- Automated threat detection
- Incident severity classification
- Initial assessment within 1 hour
**Response Team:**
- Dedicated security incident response team
- Clear escalation procedures
- Defined roles and responsibilities
- External security experts on retainer
**Response Procedures:**
1. **Containment**: Immediate isolation of affected systems
2. **Investigation**: Forensic analysis to determine scope and cause
3. **Eradication**: Remove threat and close vulnerabilities
4. **Recovery**: Restore systems and verify security
5. **Notification**: Notify affected parties as required by law
6. **Post-Incident Review**: Document lessons learned and improve processes
**Notification Timeline:**
- Merchants notified within 72 hours of confirmed data breach
- Regulatory authorities notified as required by applicable law (e.g., GDPR 72-hour requirement)
- Affected individuals notified when high risk to their rights
**Documentation:**
- All incidents documented in detail
- Annual security incident reports
- Regular training and tabletop exercises
- Continuous improvement of response procedures
### Data Processing Agreement (DPA)
Tajo operates under a comprehensive Data Processing Agreement that complies with GDPR Article 28 requirements. Key elements include:
#### Roles & Responsibilities
- **Tajo acts as Processor** for merchant customer data
- **Merchants act as Controllers** and are responsible for:
- Obtaining proper consent from customers
- Providing privacy notices
- Handling data subject rights requests
- Determining purposes and means of processing
#### Processing Details
**Purpose:** Provision of Tajo platform services, including:
- Customer data synchronization with Brevo
- Loyalty program management
- Multi-channel marketing automation
- Analytics and reporting
**Data Categories:**
- Contact information (name, email, phone)
- Order history and transaction data
- Customer preferences and consent status
- Behavioral data (clicks, opens, engagement)
- Loyalty program data (points, tiers, rewards)
**Data Subjects:**
- Merchant customers
- Website visitors
- Newsletter subscribers
- Loyalty program members
#### Sub-processors
Tajo engages the following sub-processors:
| Sub-processor | Service | Location | Safeguards |
|---------------|---------|----------|------------|
| Brevo | Email/SMS/WhatsApp platform | France (EU) | GDPR compliant, Standard Contractual Clauses |
| AWS | Cloud infrastructure | EU regions | GDPR compliant, EU-US Data Privacy Framework |
| Cloudflare | CDN and security | Global | Standard Contractual Clauses, Data Localization |
**Change Notice:**
- Merchants notified 30 days before new sub-processors are engaged
- Right to object to new sub-processors
- Alternative solutions or termination rights if objection justified
#### Data Subject Rights
Tajo assists merchants in fulfilling data subject rights:
**Supported Rights:**
- Right of access
- Right to rectification
- Right to erasure ("right to be forgotten")
- Right to data portability
- Right to object
- Right to restrict processing
**Request Handling:**
- Merchants can export customer data at any time
- Customer data deletion available through Tajo interface
- API endpoints for automated data management
- Response to data subject requests within 5 business days
#### Security Measures
See complete security measures in Appendix 4 of our DPA, including:
- Physical and logical access controls
- Encryption at rest and in transit
- Security monitoring and incident response
- Regular security audits and penetration testing
- Staff training and background checks
#### International Data Transfers
**EU Data Protection:**
- Primary data storage in EU (Belgium, France)
- Standard Contractual Clauses for any transfers outside EU
- Supplementary measures including encryption and access controls
- EU-US Data Privacy Framework certification where applicable
**CCPA Compliance:**
- Service Provider relationship clearly defined
- No sale or sharing of personal information
- Compliance with California privacy rights
- Signed data processing agreement
#### Audit Rights
Merchants have the right to:
- Request documentation of Tajo's compliance
- Review security certifications and audit reports
- Conduct audits (with reasonable notice, max once per year)
- Receive Security documentation including SOC 2 reports
### Regulatory Compliance
#### GDPR (General Data Protection Regulation)
**Compliance Status:** Fully compliant
**Key Features:**
- Valid legal basis for all processing activities
- Data Processing Agreement with all merchants
- Data Protection Impact Assessments (DPIAs) completed
- Data Protection Officer appointed: privacy@tajo.io
- Breach notification procedures (72 hours)
- Records of processing activities maintained
- Privacy by design and by default principles
#### CCPA (California Consumer Privacy Act)
**Compliance Status:** Fully compliant
**Key Features:**
- Service Provider relationship (do not sell data)
- Consumer rights supported (access, deletion, opt-out)
- Privacy policy disclosures
- "Do Not Sell My Personal Information" honored
- Annual data protection training for staff
- Contractual obligations with merchants
#### NIS 2 Directive
**Applicability:** Compliant where applicable
**Cybersecurity Measures:**
- Risk management framework implemented
- Security incident reporting to CSIRTs
- Supply chain security requirements
- Regular security assessments
- Business continuity and disaster recovery plans
#### DORA (Digital Operational Resilience Act)
**Applicability:** Ready for financial institutions using Tajo
**Compliance Features:**
- ICT risk management framework
- Incident reporting procedures
- Digital operational resilience testing
- Third-party risk management
- Regulatory access and audit rights
Note: DORA provisions apply only to regulated financial institutions. If you are a financial institution subject to DORA, contact our enterprise team for specific compliance documentation.
### Contact & Support
#### Data Protection Officer
**Email:** privacy@tajo.io
**Role:** Oversees all data protection compliance
#### Security Team
**Email:** security@tajo.io
**Role:** Handles security incidents and inquiries
#### Merchant Support
**Email:** support@tajo.io
**Website:** https://tajo.io/support
**Role:** General platform support and assistance
#### Report a Security Vulnerability
**Email:** security@tajo.io
**PGP Key:** Available at https://tajo.io/security.txt
We welcome responsible disclosure of security vulnerabilities and maintain a bug bounty program for qualifying reports.
### Additional Resources
- [Privacy Policy](/privacy)
- [Terms of Service](/terms)
- [Security Documentation](/security)
- [Cookie Policy](/cookies)
### Document Version
**Version:** 1.0
**Last Updated:** January 2025
**Next Review:** July 2025
This document is reviewed and updated regularly to ensure continued compliance with evolving data protection regulations and industry best practices.
### Frequently asked questions
**Is Tajo a data controller or a data processor?**
Tajo acts as a processor for merchant customer data under a Data Processing Agreement that follows GDPR Article 28. Merchants are the controllers and are responsible for obtaining consent, providing privacy notices and handling data subject requests.
**Does Tajo sell customer data?**
No, under no circumstances. Tajo never shares personal data with third parties for commercial purposes, transmits data to Brevo only as part of the core service, and honors CCPA Do Not Sell My Personal Information requests.
**How long does Tajo keep customer data after I close my account?**
While the merchant account is active, and merchants can delete customer data at any time. After termination all customer data is deleted within 90 days, backups are purged within 30 days, and only records required by law, such as tax records, are kept longer.
**Is my data encrypted in transit and at rest with Tajo?**
In transit with TLS 1.3 and enforced HTTPS, including the API connection to Brevo. At rest with AES-256 for the database, backups and uploaded files, with database-level encryption for sensitive fields such as API keys.
**Which sub-processors does Tajo use and where is data stored?**
Brevo in France for email, SMS and WhatsApp, AWS in EU regions for infrastructure, and Cloudflare for CDN and security, all under GDPR safeguards such as Standard Contractual Clauses. Primary storage is in the EU, in Belgium and France. Merchants get 30 days notice before a new sub-processor.
**How do I contact Tajo about privacy or report a security issue?**
The Data Protection Officer is at privacy@tajo.io and the security team at security@tajo.io, which also takes responsible vulnerability disclosures. Merchants are notified within 72 hours of a confirmed data breach, and data subject requests are answered within 5 business days.
---
## Create Contact
Source: https://tajo.io/docs/contact-management/contacts/create-contact/
Create new contacts with loyalty program data and customer attributes
Add new customers to your Brevo contact database with loyalty program information and custom attributes for personalized engagement.
### Quick Start
#### Basic Contact Creation
```http
POST https://api.brevo.com/v3/contacts
Content-Type: application/json
api-key: YOUR_API_KEY
{
"email": "customer@example.com",
"attributes": {
"FIRSTNAME": "John",
"LASTNAME": "Doe",
"LOYALTY_POINTS": 1500,
"LOYALTY_TIER": "Gold",
"SIGNUP_DATE": "2024-01-15",
"LAST_PURCHASE": "2024-01-20",
"TOTAL_SPENT": 299.99
},
"listIds": [1, 2],
"updateEnabled": true
}
```
#### Response
```json
{
"id": 123456
}
```
### Loyalty Program Integration
#### New Customer with Loyalty Attributes
```json
{
"email": "newcustomer@example.com",
"attributes": {
"FIRSTNAME": "Sarah",
"LASTNAME": "Johnson",
"PHONE": "+1234567890",
"LOYALTY_ID": "LYL-2024-001",
"LOYALTY_POINTS": 0,
"LOYALTY_TIER": "Bronze",
"PREFERRED_REWARDS": "Discounts",
"BIRTHDAY": "1990-05-15",
"SIGNUP_SOURCE": "Website",
"REFERRAL_CODE": "REF-12345",
"COMMUNICATION_PREFERENCES": "Email,SMS",
"PURCHASE_CATEGORIES": ["Electronics", "Fashion"],
"AVERAGE_ORDER_VALUE": 0
},
"listIds": [1], // New customers list
"emailBlacklisted": false,
"smsBlacklisted": false,
"updateEnabled": true
}
```
#### Existing Customer Update
```json
{
"email": "existing@example.com",
"attributes": {
"LOYALTY_POINTS": 2500,
"LOYALTY_TIER": "Platinum",
"LAST_PURCHASE": "2024-01-25",
"TOTAL_SPENT": 1299.99,
"RECENT_PURCHASES": ["Product A", "Product B"],
"ENGAGEMENT_SCORE": 8.5,
"LAST_EMAIL_OPENED": "2024-01-24",
"PREFERRED_CONTACT_TIME": "Evening"
},
"listIds": [1, 3], // Add to platinum customers list
"updateEnabled": true
}
```
### Tajo-Specific Attributes
#### Customer Loyalty Data
| Attribute Name | Type | Description |
|----------------|------|-------------|
| `LOYALTY_ID` | String | Unique loyalty program ID |
| `LOYALTY_POINTS` | Number | Current points balance |
| `LOYALTY_TIER` | String | Current tier (Bronze, Silver, Gold, Platinum) |
| `POINTS_EARNED_YTD` | Number | Points earned this year |
| `POINTS_REDEEMED_YTD` | Number | Points redeemed this year |
| `TIER_PROGRESS` | Number | Progress to next tier (%) |
| `NEXT_TIER_POINTS` | Number | Points needed for next tier |
#### Purchase Behavior
| Attribute Name | Type | Description |
|----------------|------|-------------|
| `TOTAL_SPENT` | Number | Lifetime value |
| `AVERAGE_ORDER_VALUE` | Number | Average purchase amount |
| `PURCHASE_FREQUENCY` | String | How often they buy |
| `LAST_PURCHASE` | Date | Last purchase date |
| `FAVORITE_CATEGORIES` | Array | Preferred product categories |
| `SEASONAL_BUYER` | Boolean | Shops seasonally |
#### Engagement Metrics
| Attribute Name | Type | Description |
|----------------|------|-------------|
| `ENGAGEMENT_SCORE` | Number | 1-10 engagement rating |
| `EMAIL_OPEN_RATE` | Number | Personal open rate % |
| `CLICK_THROUGH_RATE` | Number | Personal CTR % |
| `LAST_EMAIL_OPENED` | Date | Last email interaction |
| `PREFERRED_CHANNEL` | String | Email, SMS, WhatsApp |
### Batch Contact Creation
Create multiple contacts at once:
```json
{
"contacts": [
{
"email": "customer1@example.com",
"attributes": {
"FIRSTNAME": "Alice",
"LOYALTY_POINTS": 500,
"LOYALTY_TIER": "Bronze"
}
},
{
"email": "customer2@example.com",
"attributes": {
"FIRSTNAME": "Bob",
"LOYALTY_POINTS": 1200,
"LOYALTY_TIER": "Silver"
}
}
],
"listIds": [1],
"updateEnabled": true
}
```
### Error Handling
Common errors and solutions:
```json
{
"code": "duplicate_parameter",
"message": "Contact already exists",
"details": {
"email": "customer@example.com",
"existingId": 123456
}
}
```
```json
{
"code": "invalid_parameter",
"message": "Invalid list ID",
"details": {
"listIds": [999]
}
}
```
### Best Practices for Tajo
1. **Always Include Core Loyalty Fields**: LOYALTY_POINTS, LOYALTY_TIER, LOYALTY_ID
2. **Set Update Enabled**: Allow updates to existing contacts
3. **Use Segmentation Lists**: Organize by tier, behavior, preferences
4. **Track Engagement**: Monitor email/SMS interaction rates
5. **Regular Data Sync**: Keep loyalty data current with your system
### Next Steps
- Update Contact Attributes
- Manage Contact Lists
- Set up Custom Attributes
- Import Bulk Contacts
### Frequently asked questions
**How do I create a contact in Brevo through the API?**
POST a JSON body to https://api.brevo.com/v3/contacts with your key in the api-key header: the email, an attributes object such as FIRSTNAME, LASTNAME and TOTAL_SPENT, listIds for the lists to join, and updateEnabled. The response returns the new contact's id.
**What does updateEnabled do when creating a Brevo contact?**
With updateEnabled set to true the request updates an existing contact with the same email instead of failing. Without it, a second request for the same email returns a duplicate_parameter error, Contact already exists, with the existing id in details.
**Can I create several Brevo contacts in one request?**
Yes. Send a contacts array, each item with its email and attributes, plus shared listIds and updateEnabled.
**Why does Brevo reject my contact with Invalid list ID?**
The listIds array names a list that does not exist; the invalid_parameter error echoes the offending ids in details. Use ids of lists that exist in your account.
**How do I set a contact's email or SMS blacklist status when creating it?**
Include emailBlacklisted and smsBlacklisted as booleans in the request body alongside email, attributes and listIds.
---
## Contact Management
Source: https://tajo.io/docs/contact-management/
Manage contacts, lists, and segments
Create, update, and organize your contacts using the Brevo API.
### Create Contact
```javascript
const contact = {
email: "user@example.com",
attributes: {
FIRSTNAME: "John",
LASTNAME: "Doe",
SMS: "+1234567890"
},
listIds: [1, 2]
};
brevo.contacts.createContact(contact);
```
### Update Contact
```javascript
const updates = {
attributes: {
FIRSTNAME: "Jane"
}
};
brevo.contacts.updateContact("user@example.com", updates);
```
### Features
- Contact creation and updates
- List management
- Custom attributes
- Contact segmentation
- Import/export capabilities
### Frequently asked questions
**How do I create a contact with the Brevo API?**
Call brevo.contacts.createContact with an object holding the email, an attributes map such as FIRSTNAME, LASTNAME and SMS, and listIds for the lists to add the contact to.
**How do I update a contact's attributes in Brevo?**
Call brevo.contacts.updateContact with the contact's email and an object whose attributes map holds the new values, for example FIRSTNAME set to Jane.
**What can I do with contacts through the Brevo API?**
Create and update contacts, manage lists, set custom attributes, segment contacts, and import or export them.
---
## crm systems
Source: https://tajo.io/docs/crm-systems/
Documentation for crm systems
This section is under development. More content coming soon.
---
## Create Order
Source: https://tajo.io/docs/ecommerce-loyalty/orders/create-order/
Sync ecommerce orders with Brevo for loyalty point calculation and customer engagement
Synchronize ecommerce orders with Brevo to automatically calculate loyalty points, update customer tiers, and trigger personalized marketing campaigns.
### Quick Start
#### Basic Order Creation
```http
POST https://api.brevo.com/v3/ecommerce/orders
Content-Type: application/json
api-key: YOUR_API_KEY
{
"id": "ORD-2024-001",
"email": "customer@example.com",
"billing": {
"address": "123 Main St",
"city": "New York",
"country": "US",
"phone": "+1234567890"
},
"products": [
{
"id": "PROD-123",
"name": "Premium Widget",
"quantity": 2,
"price": 149.99,
"category": ["Electronics", "Gadgets"]
}
],
"revenue": 309.97,
"date": "2024-01-25T14:30:00Z"
}
```
#### Response
```json
{
"id": "ORD-2024-001",
"created": true,
"loyaltyPointsAwarded": 310
}
```
### Tajo Loyalty Integration
#### Order with Loyalty Calculation
```json
{
"id": "ORD-2024-001",
"email": "customer@example.com",
"customerId": "CUST-12345",
"loyaltyId": "LYL-2024-001",
"billing": {
"name": "John Doe",
"address": "123 Main St",
"city": "New York",
"state": "NY",
"country": "US",
"zipCode": "10001",
"phone": "+1234567890"
},
"shipping": {
"name": "John Doe",
"address": "456 Oak Ave",
"city": "Brooklyn",
"state": "NY",
"country": "US",
"zipCode": "11201",
"method": "Standard Shipping",
"cost": 9.99
},
"products": [
{
"id": "PROD-123",
"name": "Smart Watch Pro",
"variant": "Black/42mm",
"sku": "SW-PRO-BLK-42",
"quantity": 1,
"price": 299.99,
"category": ["Electronics", "Wearables"],
"brand": "TechBrand",
"loyaltyPointsEarned": 300,
"loyaltyMultiplier": 1.0
},
{
"id": "PROD-456",
"name": "Wireless Charger",
"sku": "WC-FAST-01",
"quantity": 1,
"price": 49.99,
"category": ["Electronics", "Accessories"],
"loyaltyPointsEarned": 50,
"loyaltyMultiplier": 1.0
}
],
"financial": {
"subtotal": 349.98,
"shipping": 9.99,
"tax": 28.00,
"discount": 35.00,
"total": 352.97,
"currency": "USD",
"paymentMethod": "Credit Card",
"paymentStatus": "Completed"
},
"loyalty": {
"pointsEarned": 353,
"bonusPoints": 50,
"pointsMultiplier": 1.2,
"tierBefore": "Silver",
"tierAfter": "Gold",
"tierUpgraded": true,
"totalPointsBalance": 2853,
"couponUsed": "SAVE10",
"couponDiscount": 35.00
},
"metadata": {
"source": "Website",
"campaign": "Summer Sale",
"referrer": "Google Ads",
"userAgent": "Mobile App",
"firstPurchase": false,
"returningCustomer": true
},
"date": "2024-01-25T14:30:00Z",
"status": "Completed"
}
```
### Advanced Loyalty Features
#### Birthday Bonus Order
```json
{
"loyalty": {
"pointsEarned": 200,
"birthdayBonus": 500,
"bonusReason": "Birthday Month",
"totalBonusPoints": 500,
"pointsMultiplier": 2.0,
"specialOffer": "Double Points Week"
}
}
```
#### Referral Order
```json
{
"loyalty": {
"pointsEarned": 150,
"referralBonus": 250,
"referredBy": "CUST-67890",
"referralCode": "REF-FRIEND50",
"firstPurchaseBonus": 100
},
"metadata": {
"isReferralOrder": true,
"referralSource": "Friend Referral"
}
}
```
#### Subscription Order
```json
{
"subscription": {
"id": "SUB-2024-001",
"type": "Monthly",
"frequency": 30,
"nextBilling": "2024-02-25",
"isRecurring": true
},
"loyalty": {
"pointsEarned": 100,
"subscriptionBonus": 50,
"loyaltyMultiplier": 1.1
}
}
```
### Product Categories for Loyalty
#### Category-based Point Multipliers
```json
{
"products": [
{
"id": "PROD-LUXURY-001",
"category": ["Luxury", "Fashion"],
"loyaltyMultiplier": 2.0,
"loyaltyPointsEarned": 400
},
{
"id": "PROD-ECO-001",
"category": ["Eco-Friendly", "Sustainable"],
"loyaltyMultiplier": 1.5,
"loyaltyBonus": "Eco Warrior"
}
]
}
```
### Order Status Updates
#### Order Fulfillment
```json
{
"id": "ORD-2024-001",
"status": "Shipped",
"tracking": {
"number": "TRK123456789",
"carrier": "UPS",
"url": "https://tracking.ups.com/TRK123456789"
},
"fulfillment": {
"date": "2024-01-26T10:00:00Z",
"warehouse": "NYC-01",
"method": "Ground Shipping"
}
}
```
#### Order Completion
```json
{
"id": "ORD-2024-001",
"status": "Delivered",
"delivery": {
"date": "2024-01-28T16:30:00Z",
"signature": "Customer",
"location": "Front Door"
},
"loyalty": {
"reviewIncentive": 25,
"reviewIncentiveExpiry": "2024-02-28"
}
}
```
### Batch Order Processing
Create multiple orders for bulk sync:
```json
{
"orders": [
{
"id": "ORD-2024-001",
"email": "customer1@example.com",
"products": [...],
"revenue": 199.99
},
{
"id": "ORD-2024-002",
"email": "customer2@example.com",
"products": [...],
"revenue": 299.99
}
]
}
```
### Error Handling
```json
{
"code": "duplicate_order",
"message": "Order ID already exists",
"details": {
"orderId": "ORD-2024-001",
"existingDate": "2024-01-25T14:30:00Z"
}
}
```
```json
{
"code": "invalid_customer",
"message": "Customer email not found",
"details": {
"email": "unknown@example.com",
"suggestion": "Create contact first"
}
}
```
### Webhooks Integration
Set up webhooks to sync order status changes:
```json
{
"webhookUrl": "https://your-tajo-app.com/webhooks/brevo",
"events": [
"order.created",
"order.updated",
"order.shipped",
"order.delivered",
"loyalty.points.awarded"
]
}
```
### Best Practices for Tajo
1. **Real-time Sync**: Create orders immediately after checkout
2. **Complete Data**: Include all loyalty-relevant information
3. **Status Updates**: Keep order status current for accurate tracking
4. **Error Recovery**: Handle duplicate orders and missing customers gracefully
5. **Point Calculation**: Verify loyalty point calculations match your system
6. **Customer Segmentation**: Use order data for targeted campaigns
### Analytics & Reporting
Track key metrics:
- Order value trends
- Loyalty point redemption rates
- Customer lifetime value
- Tier upgrade patterns
- Campaign effectiveness
### Next Steps
- Update Order Status
- Set up Loyalty Programs
- Configure Point Rules
- Create Product Categories
### Frequently asked questions
**How do I sync an order to Brevo through the API?**
POST to https://api.brevo.com/v3/ecommerce/orders with your api-key header and a body holding the order id, the customer's email, billing details, a products array with id, name, quantity, price and category, the revenue, and the order date.
**What order details can I send to Brevo?**
Billing and shipping blocks, products with variant, sku, brand and category, a financial block with subtotal, shipping, tax, discount, total, currency and payment details, metadata such as source and campaign, and a status with tracking and delivery information when the order ships or arrives.
**Why does Brevo say Order ID already exists?**
The duplicate_order error means an order with that id was already created; details show the existing date. Use a unique id per order, and handle duplicates gracefully in your sync.
**Why does Brevo return Customer email not found when I create an order?**
The invalid_customer error means no contact exists for that email. Create the contact first, then send the order.
**Can I send orders to Brevo in bulk?**
Yes. Send an orders array where each item carries its own id, email, products and revenue.
---
## BigCommerce Integration Guide
Source: https://tajo.io/docs/ecommerce-platforms/bigcommerce/
Complete guide to integrating Tajo with your BigCommerce store for customer data sync, loyalty programs, and marketing automation
This guide walks you through integrating Tajo with your BigCommerce store to unlock customer engagement, loyalty programs, and marketing automation capabilities.
### Overview
The Tajo-BigCommerce integration enables you to:
- **Sync customer data** automatically from your BigCommerce store
- **Track orders and products** for personalized marketing
- **Run loyalty programs** with points, tiers, and rewards
- **Automate marketing campaigns** via Brevo (email, SMS, WhatsApp)
- **Segment customers** by purchase behavior and engagement
- **Support multi-storefront** operations
### Prerequisites
Before starting the integration, ensure you have:
- **BigCommerce store** on any plan (Standard, Plus, Pro, or Enterprise)
- **Tajo account** with an active subscription
- **Brevo account** (optional, for marketing automation)
- **Store API credentials** (API account with appropriate scopes)
### Step 1: Install the Tajo App
#### From BigCommerce App Marketplace
1. Go to your BigCommerce control panel
2. Navigate to **Apps → Marketplace**
3. Search for "Tajo"
4. Click **Get This App**
5. Review permissions and click **Install**
6. Follow the setup wizard to connect your Tajo account
#### API Configuration
After installation, configure API access:
```json
{
"api_credentials": {
"client_id": "your_client_id",
"client_secret": "your_client_secret",
"access_token": "your_access_token",
"store_hash": "your_store_hash"
},
"scopes": [
"store_v2_customers",
"store_v2_orders",
"store_v2_products",
"store_cart",
"store_checkout"
]
}
```
### Step 2: Configure Data Sync
#### Customer Sync Settings
Configure which customer data to sync:
```json
{
"sync_settings": {
"customers": {
"enabled": true,
"sync_frequency": "real-time",
"fields": [
"email",
"first_name",
"last_name",
"phone",
"company",
"customer_group_id",
"store_credit",
"addresses",
"date_created"
]
},
"orders": {
"enabled": true,
"sync_frequency": "real-time",
"include_products": true,
"include_shipping": true,
"include_coupons": true
},
"products": {
"enabled": true,
"sync_frequency": "hourly",
"include_variants": true,
"include_images": true,
"include_custom_fields": true
}
}
}
```
#### Webhook Configuration
Tajo registers these BigCommerce webhooks:
| Webhook | Purpose |
|---------|---------|
| `store/customer/created` | Sync new customers to Tajo & Brevo |
| `store/customer/updated` | Keep customer profiles current |
| `store/order/created` | Track purchases, award loyalty points |
| `store/order/statusUpdated` | Trigger status-based campaigns |
| `store/cart/created` | Track cart for abandonment |
| `store/cart/updated` | Update cart abandonment sequences |
| `store/product/updated` | Keep product catalog synced |
#### Multi-Storefront Support
For BigCommerce Enterprise with multiple storefronts:
```json
{
"multi_storefront": {
"enabled": true,
"storefronts": [
{
"channel_id": 1,
"name": "Main Store",
"loyalty_program": "default"
},
{
"channel_id": 2,
"name": "Wholesale",
"loyalty_program": "b2b_program"
},
{
"channel_id": 3,
"name": "International",
"loyalty_program": "global_program"
}
],
"sync_across_channels": true
}
}
```
### Step 3: Set Up Loyalty Program
#### Configure Points System
```javascript
const pointsConfig = {
// Points per dollar spent
purchasePoints: {
enabled: true,
rate: 1, // 1 point per $1
roundingMode: 'floor'
},
// Bonus actions
bonusPoints: {
accountCreation: 100,
firstPurchase: 200,
reviewSubmitted: 50,
referralMade: 500,
birthdayBonus: 100,
newsletterSignup: 25
},
// Customer group multipliers
customerGroupMultipliers: {
'Retail': 1.0,
'VIP': 1.5,
'Wholesale': 0.5,
'Platinum': 2.0
}
};
```
#### Loyalty Tiers
```javascript
const loyaltyTiers = [
{
name: 'Bronze',
minPoints: 0,
benefits: [
'1 point per $1 spent',
'Birthday bonus points',
'Member-only promotions'
]
},
{
name: 'Silver',
minPoints: 1000,
benefits: [
'1.25x points multiplier',
'Free shipping on orders $50+',
'Early access to sales'
]
},
{
name: 'Gold',
minPoints: 5000,
benefits: [
'1.5x points multiplier',
'Free shipping on all orders',
'Exclusive product access',
'Priority support'
]
},
{
name: 'Platinum',
minPoints: 15000,
benefits: [
'2x points multiplier',
'Free express shipping',
'VIP experiences',
'Dedicated account manager'
]
}
];
```
### Step 4: B2B Customer Management
#### Company Accounts
BigCommerce supports B2B features that integrate with Tajo:
```javascript
const b2bConfig = {
companyAccounts: {
enabled: true,
syncCompanyData: true,
fields: [
'company_name',
'tax_id',
'credit_limit',
'payment_terms',
'price_list'
]
},
// B2B-specific loyalty rules
b2bLoyalty: {
orderVolumeBonus: {
threshold: 10000,
bonusMultiplier: 1.5
},
reorderPoints: {
enabled: true,
rate: 0.5 // 0.5 points per $1 on reorders
}
}
};
```
#### Customer Groups Integration
```javascript
// Map BigCommerce customer groups to Tajo segments
const customerGroupMapping = {
'Retail': {
tajoSegment: 'retail_customers',
loyaltyTier: 'Bronze',
emailList: 'retail_newsletter'
},
'Wholesale': {
tajoSegment: 'wholesale_customers',
loyaltyTier: 'Silver',
emailList: 'wholesale_updates'
},
'VIP': {
tajoSegment: 'vip_customers',
loyaltyTier: 'Gold',
emailList: 'vip_exclusive'
}
};
```
### Step 5: Abandoned Cart Recovery
#### Cart Tracking
```javascript
// BigCommerce cart webhook handler
async function handleCartWebhook(event) {
const cart = await bigcommerce.carts.get(event.data.cartId);
if (!cart.customer_id && !cart.email) {
return; // Can't track without identity
}
await tajo.carts.track({
customerId: cart.customer_id,
email: cart.email,
cartId: cart.id,
items: cart.line_items.physical_items.map(item => ({
productId: item.product_id,
variantId: item.variant_id,
title: item.name,
quantity: item.quantity,
price: item.sale_price || item.list_price,
image: item.image_url
})),
totalPrice: cart.cart_amount,
currency: cart.currency.code,
checkoutUrl: cart.redirect_urls?.checkout_url
});
}
```
#### Recovery Sequence
```json
{
"abandoned_cart_sequence": {
"trigger": {
"event": "cart_abandoned",
"delay": "1 hour"
},
"messages": [
{
"delay": "1 hour",
"channel": "email",
"template": "cart_reminder_1",
"subject": "You left something behind!"
},
{
"delay": "24 hours",
"channel": "email",
"template": "cart_reminder_2",
"subject": "Your cart is waiting - 10% off inside"
},
{
"delay": "72 hours",
"channel": "sms",
"template": "cart_sms_final"
}
],
"exit_conditions": [
"order_completed",
"cart_emptied",
"unsubscribed"
]
}
}
```
### Step 6: Marketing Automation
#### Customer Segments
```javascript
const bigcommerceSegments = [
// Purchase behavior
{
name: 'First-Time Buyers',
conditions: { orders_count: 1 }
},
{
name: 'Repeat Customers',
conditions: { orders_count: { $gte: 2 } }
},
{
name: 'High-Value Customers',
conditions: { total_spent: { $gte: 1000 } }
},
// Customer groups
{
name: 'Wholesale Accounts',
conditions: { customer_group: 'Wholesale' }
},
// Engagement
{
name: 'At-Risk Customers',
conditions: {
last_order_date: { $lt: '-90 days' },
orders_count: { $gte: 2 }
}
}
];
```
#### Automated Campaigns
```javascript
// Order status change triggers
bigcommerce.webhooks.on('store/order/statusUpdated', async (event) => {
const order = await bigcommerce.orders.get(event.data.orderId);
const customer = await tajo.customers.getByEmail(order.billing_address.email);
switch (event.data.status.new_status) {
case 'Shipped':
await brevo.trackEvent(customer.email, 'order_shipped', {
orderId: order.id,
trackingNumber: order.tracking_number,
carrier: order.shipping_carrier
});
break;
case 'Completed':
// Award loyalty points
const points = calculatePoints(order, customer);
await tajo.loyalty.awardPoints(customer.id, points);
// Trigger review request after 14 days
await brevo.scheduleEvent(customer.email, 'review_request', {
orderId: order.id,
products: order.products
}, { delay: '14 days' });
break;
}
});
```
### Step 7: Analytics
#### Dashboard Metrics
```javascript
const dashboardMetrics = {
customers: {
total: await tajo.analytics.count('customers'),
byChannel: await tajo.analytics.groupBy('customers', 'channel_id'),
newThisMonth: await tajo.analytics.count('customers', {
created_at: { $gte: 'this_month' }
})
},
revenue: {
total: await tajo.analytics.sum('orders.total'),
byChannel: await tajo.analytics.groupBy('orders', 'channel_id', {
aggregate: 'sum',
field: 'total'
}),
averageOrderValue: await tajo.analytics.avg('orders.total')
},
loyalty: {
activeMembers: await tajo.analytics.count('loyalty_members'),
pointsIssued: await tajo.analytics.sum('points.awarded'),
redemptionRate: await tajo.analytics.pointsRedemptionRate()
}
};
```
### Troubleshooting
#### API Rate Limits
```javascript
// Implement rate limiting
async function bigcommerceApiCall(endpoint, options, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
const response = await fetch(endpoint, options);
if (response.status === 429) {
const retryAfter = response.headers.get('X-Rate-Limit-Time-Reset-Ms');
await sleep(parseInt(retryAfter) || Math.pow(2, i) * 1000);
continue;
}
return response;
} catch (error) {
if (i === retries - 1) throw error;
}
}
}
```
#### Webhook Verification
```javascript
// Verify BigCommerce webhook signature
function verifyWebhook(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('base64');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}
```
### Next Steps
1. **[Configure Brevo Integration](/docs/platform-integration/tajo-brevo-integration)** for email/SMS campaigns
2. **[Set Up Webhooks](/docs/webhook-configuration/setup-guide)** for real-time events
3. **[Create Customer Segments](/docs/contact-management)** for targeted marketing
4. **[Build Email Templates](/docs/messaging-api)** for automated campaigns
### Support
- **Integration Support**: support@tajo.io
- **BigCommerce Documentation**: [developer.bigcommerce.com](https://developer.bigcommerce.com)
- **API Reference**: [docs.tajo.io/api](/docs/endpoints/rest-api)
- **Contact Support**: [/contact](/contact)
### Frequently asked questions
**Which BigCommerce webhooks does the Tajo integration use?**
store/customer/created and updated for customer profiles, store/order/created and store/order/statusUpdated for purchases and status-based campaigns, store/cart/created and updated for abandonment, and store/product/updated for the catalog.
**How do I verify a BigCommerce webhook signature?**
Compute an HMAC-SHA256 of the payload with your secret, base64-encode it, and compare it in constant time with the signature header.
---
## E-commerce Platforms
Source: https://tajo.io/docs/ecommerce-platforms/
Integrate Tajo with your e-commerce platform for customer data sync, loyalty programs, and marketing automation
Connect Tajo with your e-commerce platform to unlock powerful customer engagement capabilities including real-time data sync, loyalty programs, and automated marketing campaigns.
### Supported Platforms
#### [Shopify](/docs/ecommerce-platforms/shopify)
The most popular e-commerce platform with full Tajo integration support:
- **Real-time sync** of customers, orders, and products
- **Loyalty programs** with points, tiers, and rewards
- **Abandoned cart recovery** with multi-channel sequences
- **Product recommendations** powered by purchase history
- **Marketing automation** via Brevo (email, SMS, WhatsApp)
[Get started with Shopify integration →](/docs/ecommerce-platforms/shopify)
#### [WooCommerce](/docs/ecommerce-platforms/woocommerce)
WordPress e-commerce integration with:
- **Real-time engagement events** (orders, carts, refunds, reviews) via the Tajo for WooCommerce plugin's durable outbox
- **Customer and order synchronization** via the WooCommerce REST API
- **Form submission capture** for Contact Form 7, WPForms, Gravity Forms, and Fluent Forms
- **Marketing automation** support via Brevo
[Get started with WooCommerce integration →](/docs/ecommerce-platforms/woocommerce)
#### [BigCommerce](/docs/ecommerce-platforms/bigcommerce)
Enterprise e-commerce integration featuring:
- **Multi-storefront support** for complex setups
- **B2B customer management** with company accounts
- **Customer group integration** with loyalty tiers
- **Advanced segmentation** by channel
[Get started with BigCommerce integration →](/docs/ecommerce-platforms/bigcommerce)
#### [Magento / Adobe Commerce](/docs/ecommerce-platforms/magento)
Adobe Commerce integration with:
- **Complex product catalog sync** including configurables
- **Multi-website support** with per-site configuration
- **Enterprise loyalty features** with customer groups
- **CLI tools** for data management
[Get started with Magento integration →](/docs/ecommerce-platforms/magento)
### Integration Features
All e-commerce integrations include:
| Feature | Description |
|---------|-------------|
| **Customer Sync** | Automatic sync of customer profiles and preferences |
| **Order Tracking** | Real-time order and purchase history sync |
| **Product Catalog** | Product data sync for recommendations |
| **Loyalty Programs** | Points, tiers, rewards, and referrals |
| **Marketing Automation** | Triggered campaigns via Brevo |
| **Analytics** | Unified reporting across platforms |
### Getting Started
1. Choose your e-commerce platform above
2. Follow the installation guide
3. Configure data sync settings
4. Set up your loyalty program
5. Connect Brevo for marketing automation
### Need Help?
- **Support**: support@tajo.io
- **API Reference**: [REST API Documentation](/docs/endpoints/rest-api)
- **Contact Support**: [/contact](/contact)
### Frequently asked questions
**What does the Tajo WooCommerce integration include?**
Engagement events such as orders, carts, refunds and reviews through the Tajo for WooCommerce plugin's durable outbox, customer and order synchronization through the WooCommerce REST API, form capture for Contact Form 7, WPForms, Gravity Forms and Fluent Forms, and marketing automation via Brevo.
**How do I get started with a Tajo e-commerce integration?**
Choose your platform, follow its installation guide, configure the data sync settings, and connect Brevo for marketing automation.
**Does the Tajo WooCommerce integration capture form submissions?**
Yes. Alongside order, cart, refund and review events, it captures form submissions from Contact Form 7, WPForms, Gravity Forms and Fluent Forms.
---
## Magento Integration Guide
Source: https://tajo.io/docs/ecommerce-platforms/magento/
Connect Adobe Commerce (Magento) to Tajo through the Commerce REST API for customer, order, and product sync
Tajo connects to Adobe Commerce (Magento 2) through the **Commerce REST API**. There is no Tajo extension to install in your Magento codebase — the connection uses an integration token, which keeps your store's deploy pipeline untouched.
Magento is currently an **onboarding-built connection**: unlike Shopify and WooCommerce, it is not yet self-serve, and your Tajo team wires the sync as part of onboarding. The [connector implementation status](/docs/connectors/magento/) tracks where it stands. The store-side preparation below is everything Magento needs from your end, and it works with stock Magento — no code changes.
### Prerequisites
- **Adobe Commerce / Magento Open Source 2.4+**
- Admin access to create an integration token
- HTTPS on your store (required for token auth)
- **Tajo account** with an active subscription
### Step 1: Create a Magento integration token
1. In Magento admin, go to **System → Extensions → Integrations → Add New Integration**.
2. Name it `Tajo`, set your admin password, and under **API** grant read access to **Customers**, **Sales**, and **Catalog** resources.
3. Save, then **Activate** the integration and copy the **Access Token**.
Tajo authenticates with `Authorization: Bearer ` against your store's REST base URL (`https://yourstore.com/rest/V1/`).
### Step 2: Hand the connection to your Tajo team
Share with your Tajo onboarding contact:
| Field | Value |
|-------|-------|
| **Store URL** | `https://yourstore.com` |
| **Access token** | The integration token from Step 1 |
The connection is validated with a read-only request before any sync starts. Rotate the token in Magento at any time to revoke access.
### What a Magento connection syncs
- **Customers** — identity fields and account metadata for contact resolution; marketing consent is never inferred from an account's existence
- **Orders** — purchase history, totals, currency, status, and line items for lifecycle segmentation and win-back automations
- **Products and categories** — catalog structure for interest segmentation and product-aware campaigns
Historical import runs first, then incremental sync keeps Tajo current by polling modified records. Real-time storefront events (carts, checkouts in progress) require an in-store extension, which Magento does not get today — order-based automations remain fully supported through sync.
### Marketing automation
Automations (email, SMS, WhatsApp via Brevo and other providers) are configured in Tajo using the synced data — for example post-purchase follow-ups on new orders, win-back on lapsed customers, and product-interest campaigns from category history.
### Troubleshooting
| Symptom | Cause and fix |
|---------|---------------|
| 401 from the store | The integration token was regenerated or the integration deactivated — reactivate and update the token in Tajo |
| Customers sync but orders don't | The integration's API grants are missing the **Sales** resource |
| Slow initial import | Large stores import in pages; your Tajo contact can report progress at any point |
### Next steps
- [Magento connector reference](/docs/connectors/magento/) — implementation status and technical notes
- [Customer sync](/docs/skills/data-sync/customer-sync/) — mapping Magento customers into your system of record
### Frequently asked questions
**How does Tajo connect to Magento or Adobe Commerce?**
Through the Commerce REST API with an integration token. There is no Tajo extension to install in your Magento codebase, and Tajo authenticates with Authorization: Bearer against your store's REST base URL at /rest/V1/.
**Is the Magento integration self-serve in Tajo?**
No. Magento is an onboarding-built connection: unlike Shopify and WooCommerce, your Tajo team wires the sync during onboarding. You prepare the store side by creating the integration token and sharing the store URL and token.
**How do I create a Magento integration token for Tajo?**
In Magento admin go to System, Extensions, Integrations, Add New Integration. Name it Tajo, enter your admin password, grant read access to Customers, Sales and Catalog under API, save, activate the integration and copy the access token. You need Magento 2.4 or later with HTTPS.
**What does a Magento connection sync to Tajo?**
Customers with identity fields and account metadata, orders with purchase history, totals, currency, status and line items, and products and categories. A historical import runs first, then incremental sync polls modified records. Marketing consent is never inferred from an account's existence.
**Does Tajo get real-time cart events from Magento?**
No. Real-time storefront events such as carts and checkouts in progress need an in-store extension, which Magento does not get today. Order-based automations such as post-purchase and win-back remain fully supported through sync.
**Why do Magento customers sync but orders do not?**
The integration's API grants are missing the Sales resource. A 401 from the store instead means the token was regenerated or the integration deactivated; reactivate it and update the token in Tajo.
---
## Shopify Integration Guide
Source: https://tajo.io/docs/ecommerce-platforms/shopify/
How Tajo connects a Shopify store to Brevo: the Shopify app's webhook sync, sync rules an agent builds and a person approves, and the Shopify MCP tools.
Tajo connects Shopify to Brevo in two places. The Tajo Shopify app turns Shopify webhooks into Brevo writes as they arrive. Sync rules, which an agent builds and a person approves, move records into Brevo on a schedule. This page covers both, then the Shopify tools Tajo serves over MCP.
### Prerequisites
Before starting the integration, ensure you have:
- **Shopify store** on any plan (Basic, Shopify, Advanced, or Plus)
- **Tajo account** (Tajo is in early access)
- **Brevo account**, the destination for the sync
- **Admin access** to your Shopify store
### Step 1: Connect Your Shopify Store
Tajo is in early access. The Shopify app is not listed in the Shopify App Store, and there is no self-serve install link. [Contact the team](/contact) to get set up. Once your Tajo workspace is ready:
1. In Tajo, open **Connections**.
2. Enter your store's myshopify.com domain and choose **Connect Shopify**. Shopify shows the scopes Tajo requests and returns you to Tajo when you approve them.
3. Check what each scope is for, and what Tajo writes back to Shopify, in [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/).
### Step 2: What the Tajo Shopify App Sends to Brevo
The app verifies each Shopify webhook, stores it, queues it and processes it straight away. Customer and product topics wait about four seconds first. There is no batch window. A failed job is retried with backoff.
#### Webhook topics
The Tajo Shopify app subscribes to these Shopify webhook topics:
| Webhook topics | Purpose |
|----------------|---------|
| `customers/create`, `customers/update`, `customers/delete` | Keep Brevo contacts current |
| `orders/create`, `orders/updated`, `orders/fulfilled`, `orders/cancelled` | Order events and order metrics for Brevo |
| `orders/paid`, `refunds/create` | Award and deduct loyalty points |
| `checkouts/create`, `checkouts/update` | Abandoned checkout recovery in Brevo |
| `products/create`, `products/update`, `products/delete` | Keep the product catalog in Brevo current |
| `inventory_levels/update` | Keep product stock in Brevo current |
| `collections/create`, `collections/update`, `collections/delete` | Keep collections current |
| `companies/*`, `company_contacts/*`, `company_locations/*` (create, update, delete) | B2B company sync |
| `app/uninstalled`, `app/scopes_update`, `app_subscriptions/update` | App lifecycle |
Shopify's mandatory privacy webhooks (customer data request, customer redact, shop redact) are also handled. The app does not subscribe to `carts/*`. Abandoned carts come from the `checkouts/*` topics.
What lands in Brevo:
| Shopify event | In Brevo |
|---------------|----------|
| Customer created or updated | The contact is created or updated with name, email and marketing consent. On paid plans the app adds tags, order count, amount spent and last order. |
| Customer deleted | The contact is unsubscribed, not deleted |
| Order created, updated, paid, fulfilled or cancelled | The order through Brevo's orders API, and the events `order_paid`, `order_completed` and `order_cancelled` |
| Refund created | The event `order_refunded`. If you run a Brevo loyalty program through Tajo, points are deducted in proportion. |
| Order paid, with a Brevo loyalty program | Points awarded at your points-per-dollar rate |
| Checkout created or updated, with an email and items | The events `cart_updated` and `cart_abandoned`. Your Brevo automation decides when to send. |
| Product or collection created, updated or deleted | Brevo's product catalog and categories |
| Inventory level updated | The product's stock in Brevo's catalog. When a variant goes from 0 to above 0, each shopper who asked to be notified gets a `back_in_stock` event, once per restock. |
The app does not add a "Notify me" button to your theme. A back-in-stock request has to come from your storefront, for example from a button you add.
#### Existing data
On install, the app imports your existing customers as Brevo contacts. A full historical sync is started from the app's sync page. On paid plans it also imports products, collections, companies and orders.
### Step 3: Build a Sync Rule with the Agent
A sync rule is a declarative definition of one sync: a source resource, a Brevo action, a field map and a filter. You do not write it by hand. You describe it, an agent builds it, and a person approves it.
1. In Tajo, open **Agents** and ask the **Brevo Integration Architect** for the sync in plain language. For example: "Send Shopify customers who accepted email marketing to Brevo as contacts."
2. The agent inspects the Shopify connector. Its sample returns field names and types, never customer values.
3. It proposes a rule with a field map and a filter, then validates the field map against Brevo's action and dry-runs the draft. Neither step reads customer records.
4. It saves the rule as a draft. You can also start from a template under **Connections > Syncs and mappings > New sync from template**.
5. **Request publish approval** runs a preview against your store. It reads at most 10 records, writes nothing to Brevo and does not move the cursor. It records counts only: records pulled, eligible, mapped and rejected by the filter, plus mapping errors. If the preview fails, no approval is created.
6. A person approves the request on the **Approvals** page, with a written rationale. The approval is bound to a SHA-256 digest of the rule and expires after 30 minutes. The rule page then shows **Publish approved version**.
Editing a published rule returns it to draft. It goes back through preview and approval before it runs again.
#### A real rule
This is the **Shopify customers -> Brevo contacts** template as Tajo defines it:
```ts
sourceSlug: "shopify",
sourceResource: "customers",
destinationSlug: "brevo",
destinationAction: "upsert_contact",
fieldMap: [
{ source: "email", destination: "email", transform: "toLowerCase" },
{ source: "first_name", destination: "attributes.FIRSTNAME" },
{ source: "last_name", destination: "attributes.LASTNAME" },
{ source: "phone", destination: "attributes.PHONE" },
{ source: "total_spent", destination: "attributes.TOTAL_SPENT", transform: "toNumber" },
{ source: "orders_count", destination: "attributes.ORDERS_COUNT", transform: "toNumber" },
{ source: "tajo_email_marketing_consent", destination: "attributes.OPT_IN", transform: "toBoolean" },
{ source: "tags", destination: "attributes.SHOPIFY_TAGS" },
{ source: "id", destination: "attributes.SHOPIFY_ID", transform: "toString" },
{ source: "created_at", destination: "attributes.SHOPIFY_CREATED_AT" },
{ source: "updated_at", destination: "attributes.SHOPIFY_UPDATED_AT" },
],
filterExpression:
"($json.tajo_email_marketing_consent === true) && ($json.tajo_email_suppressed === false)",
```
The filter is the consent check. Tajo derives both values from Shopify's `email_marketing_consent.state`, or the older `accepts_marketing` flag. A rule that writes contacts to Brevo cannot be published without it. The other Shopify template, **Shopify orders → Brevo orders**, records orders in Brevo for buyers who accepted marketing at checkout.
#### When a rule runs
- Contact sync rules run every 15 minutes by default. Each run starts from the rule's cursor.
- An active rule's page has a **Test run (1 batch)** button.
- An active, published **Shopify orders → Brevo orders** rule also runs every 15 minutes. Its first scheduled run starts a few minutes before that moment and sends no older orders. Each later run sends the orders updated since the previous one.
- Past orders reach Brevo only when you run the rule yourself: with **Test run (1 batch)**, or by asking the **Sync Operator** agent to run it.
- An orders rule runs on schedule only with the template's buyer marketing opt-in filter. A rule whose filter was edited runs only when you start it.
- After five consecutive failed runs, the rule pauses itself and its page shows the last error. Fix the cause, then publish again.
Each run is listed in the rule's run history with records read, written and failed, and its duration.
### What the Shopify Connector Reads and Writes
Sync rules only write to the destination, here Brevo. They never write to Shopify.
The Tajo Shopify app requests 12 scopes and makes a short list of writes to Shopify, such as consent opt-outs and loyalty tags. [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/) lists every scope and every write, with what triggers it.
Agents and MCP hosts reach the store through the Shopify connector:
| Reads | Writes |
|-------|--------|
| Shop details, customers (list and search), orders, products, customer metafields, inventory levels, bulk export status | Customer metafields and customer tags, and starting a bulk export. Each write is staged as a proposal and runs only after it is approved. |
The connector also declares an inventory adjustment. It needs the `write_inventory` scope, which the Tajo Shopify app does not request.
### Step 4: Use the Shopify Tools over MCP
Tajo serves the Shopify connector as an MCP server at `https://alto.tajo.io/mcp/connectors/shopify`. Add it to Claude Code:
```bash
claude mcp add --transport http tajo-shopify https://alto.tajo.io/mcp/connectors/shopify
```
The host discovers Tajo's OAuth server and opens the Tajo sign-in. Access is limited to early-access accounts. The server exposes 12 tools:
| Tool | What it does |
|------|--------------|
| `preview_tajo_shopify_app` | Interactive preview of the Tajo Shopify app, rendered as MCP UI |
| `get_shop` | The shop's details |
| `search_customers` | Search customers with Shopify query syntax, such as `tag:tajo-vip` or `total_spent:>100` |
| `list_customers` | List customers, paginated |
| `list_orders` | List orders, paginated |
| `list_products` | List products with variants, images and inventory |
| `get_customer_metafields` | Read a customer's metafields |
| `get_inventory_levels` | Read a variant's inventory across locations |
| `poll_bulk_export` | Check a bulk export and get its download link when it completes |
| `calculate_rewards_profile` | Calculate a customer's tier, points and reward balance from synced commerce data |
| `shopify_propose` | Stage one Shopify write as a proposal. Nothing is sent. |
| `shopify_apply` | Run an approved proposal |
### Troubleshooting
- Contacts not appearing in Brevo: see [contacts missing in Brevo](/resources/help/troubleshooting/contacts-missing-in-brevo/).
- A rule that does not run, or paused itself: see [data not syncing](/resources/help/troubleshooting/data-not-syncing/).
### Next Steps
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/), how sync rules behave
- [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/), every scope and every write
- [Shopify + Brevo](/docs/integrations/shopify-brevo), the integration guide
- [Contact the team](/contact) to get set up
### Frequently asked questions
**How does Shopify data reach Brevo with Tajo?**
Two ways. The Tajo Shopify app processes Shopify webhooks as they arrive and writes customers, orders, checkouts, products, collections and stock to Brevo. Sync rules, which an agent builds and a person approves, move records such as Shopify customers into Brevo contacts on a schedule.
**How is a Shopify to Brevo sync rule created?**
You describe the sync to the Brevo Integration Architect agent. It inspects the Shopify connector, proposes a rule with a field map and a consent filter, and validates it. A preview then reads at most 10 records and writes nothing, and a person approves that exact rule before it can be published.
**Does Tajo sync Shopify to Brevo in real time?**
The Tajo Shopify app does: each webhook is queued and processed as it arrives, with a delay of about four seconds on customer and product topics. Sync rules do not: contact sync rules run every 15 minutes by default, and an active rule can be test-run from its page.
---
## WooCommerce Integration Guide
Source: https://tajo.io/docs/ecommerce-platforms/woocommerce/
Connect your WooCommerce store to Tajo with the Tajo for WooCommerce plugin: real-time engagement events, durable delivery, and privacy-minimized customer data
This guide connects a WooCommerce store to Tajo. The integration has two halves that work together:
- **Tajo for WooCommerce plugin** — captures real-time engagement events (orders, carts, refunds, reviews, form submissions) inside WordPress and delivers them to Tajo through a durable, signed outbox.
- **WooCommerce REST connection** — Tajo reads your store's customers, orders, products, coupons, refunds, and reviews for historical import and ongoing sync. See the [WooCommerce connector reference](/docs/connectors/ecommerce/woocommerce/) for the REST-only setup.
Marketing automation itself (email, SMS, WhatsApp via Brevo and other providers) is configured in Tajo, not in the plugin. The plugin's job is to get trustworthy events out of WordPress.
### Prerequisites
- **WordPress 6.3+** with admin access
- **PHP 7.4+**
- **WooCommerce 7.0+** (the plugin also works on WordPress sites without WooCommerce — commerce adapters simply stay inactive)
- **Tajo account** with a WordPress connection created
- HTTPS on the Tajo endpoint (always true for hosted Tajo)
### Step 1: Install the Tajo for WooCommerce plugin
#### Manual installation
```bash
# Download the plugin
cd wp-content/plugins
wget https://tajo.io/downloads/woocommerce/tajo-woocommerce-latest.zip
# Verify and unzip
unzip tajo-woocommerce-latest.zip
```
Then activate from WordPress admin:
1. Go to **Plugins → Installed Plugins**
2. Find "Tajo for WooCommerce"
3. Click **Activate**
You can also upload the zip directly via **Plugins → Add New → Upload Plugin**. A SHA-256 checksum is published alongside each release at [tajo.io/downloads/woocommerce/](https://tajo.io/downloads/woocommerce/tajo-woocommerce-1.0.0.zip.sha256). The plugin is not yet listed in the WordPress.org directory; manual installation is the supported path today.
### Step 2: Configure the connection
Navigate to **WooCommerce → Tajo** (on sites without WooCommerce: **Settings → Tajo**) and enter the three values from your Tajo WordPress connection:
| Field | Value |
|-------|-------|
| **Tajo endpoint** | The HTTPS webhook URL shown in Tajo, e.g. `https://alto.tajo.io/api/connectors/wordpress/webhooks/engagement` |
| **Binding ID** | The connection's binding ID from Tajo |
| **Signing secret** | The shared secret (32–256 characters). The plugin generates a strong local secret on activation; paste it into Tajo, or paste Tajo's secret here |
There are no API-key constants to add to `wp-config.php`. Events remain safely queued in the local outbox until all three values are saved.
Then verify the pipe end to end:
1. Click **Queue test event**, then **Process now**.
2. The delivery outbox table should show the event as delivered.
3. In Tajo, confirm the `connection.test` event arrived on the WordPress connection.
### What the plugin sends
Every event is a compact, privacy-minimized envelope signed with HMAC-SHA256. Only engagement identity fields (email, phone, local IDs) plus bounded event metadata leave WordPress — never names, postal addresses, IP addresses, user agents, comment bodies, arbitrary form fields, order notes, or payment details.
#### WooCommerce events
| Hook | Event |
|------|-------|
| `woocommerce_created_customer` / `woocommerce_update_customer` | `customer.created` / `customer.updated` |
| `woocommerce_new_product` / `woocommerce_update_product` | `product.created` / `product.updated` |
| `woocommerce_add_to_cart`, item removal, coupon apply/remove | `cart.updated` (with cart summary for abandonment flows) |
| `woocommerce_cart_emptied` | `cart.emptied` |
| `woocommerce_new_order` / `woocommerce_update_order` | `order.placed` / `order.updated` |
| `woocommerce_order_status_changed` | `order.status_changed` (+ `order.fulfilled` on completion) |
| `woocommerce_payment_complete` | `order.paid` |
| `woocommerce_order_refunded` | `refund.created` |
| WooCommerce Subscriptions status updates | `subscription.status_changed` |
Order events carry the order number, status, currency, totals, line items, and ready-to-use review/reorder URLs — enough for post-purchase and win-back automations without a follow-up API call.
#### WordPress events
- `contact.created` / `contact.updated` / `contact.deleted` for user accounts
- `content.published` / `content.updated` / `content.unpublished` for public content
- `comment.created` / `comment.status_changed` for visitor comments and product reviews (internal WooCommerce order notes, pingbacks, and trackbacks are never emitted)
- `form.submitted` for successful **Contact Form 7**, **WPForms**, **Gravity Forms**, and **Fluent Forms** submissions — only typed email/phone identity fields and form metadata are extracted; arbitrary submitted fields are discarded
### Reliability: the delivery outbox
The plugin never fires events at Tajo directly from a page load. Every event is written to a local outbox table first, then delivered by WP-Cron with:
- Bounded exponential backoff (up to 8 attempts, honoring `Retry-After`)
- Dead letters with one-click **Replay dead letters** in the admin
- Retention limits so an unreachable endpoint can never hoard personal data (delivered: 7 days; queued: 30 days; dead letters: 30 days after last update)
- Idempotent event IDs, so retries and replays never duplicate downstream
If your host disables WP-Cron (`DISABLE_WP_CRON`), invoke `wp-cron.php` from a real scheduler at least once per minute.
### Consent is never inferred
Account creation, checkout, purchase, and generic form submissions are **not** treated as marketing consent. Built-in events carry an empty consent list. To record explicit consent (for example from a checked newsletter box), emit it through the extension hook:
```php
do_action(
'tajo_engagement_emit',
'consent.updated',
array( 'email' => $email ),
array( 'policyVersion' => '2026-07' ),
array(
array(
'channel' => 'email',
'status' => 'opt_in', // or 'opt_out'
'purpose' => 'marketing',
'source' => 'newsletter_checkbox',
'evidence' => array( 'formId' => 'newsletter-footer', 'field' => 'marketing_email' ),
),
),
gmdate( 'c' )
);
```
The same hook lets any plugin or theme emit custom events; everything passes through the same sanitizer, outbox, and signature.
### Step 3: Historical import
Real-time events cover everything from installation onward. For the history that predates the plugin, Tajo's WooCommerce REST connection imports existing customers, orders, products, coupons, refunds, and reviews — configured entirely on the Tajo side with a WooCommerce REST API key (**WooCommerce → Settings → Advanced → REST API**, read permission). See the [WooCommerce connector reference](/docs/connectors/ecommerce/woocommerce/) for details.
### Privacy and GDPR
- The plugin registers with WordPress **Tools → Export Personal Data** and **Tools → Erase Personal Data**; retained outbox events for a matching email are exported or erased locally.
- Erasure and delivery share a fail-closed mutex, so an erasure can never report completion while a payload is mid-send.
- Local erasure covers the WordPress outbox only — submit the corresponding request in Tajo for downstream data.
- Deactivation pauses delivery but keeps configuration and queued events; **deleting** the plugin permanently removes the outbox, settings, secret, and schedules.
### Compatibility
- **HPOS**: the plugin declares WooCommerce High-Performance Order Storage compatibility and uses only CRUD objects and public hooks.
- **WooCommerce Subscriptions**: subscription status changes are captured when the extension is active.
- **Multisite**: uninstall cleans up every site in the network.
### Operations reference
Server-to-server discovery and outbox control are available to administrators via Application Password authentication:
| Method | Route | Purpose |
|--------|-------|---------|
| `GET` | `/wp-json/tajo/v1/capabilities` | Plugin version, detected adapters, event inventory, outbox health |
| `GET` | `/wp-json/tajo/v1/outbox` | Outbox counts (payloads are never exposed) |
| `POST` | `/wp-json/tajo/v1/outbox/process` | Process a batch immediately |
| `POST` | `/wp-json/tajo/v1/outbox/replay` | Replay dead letters |
### Troubleshooting
| Symptom | Cause and fix |
|---------|---------------|
| Events stay "Queued" | Endpoint, binding ID, or secret not saved yet — delivery is paused until all three are configured |
| Events stay "Retrying" | Tajo endpoint unreachable from your host, or WP-Cron isn't running — check the outbox table's error column and your cron setup |
| Dead letters accumulate | A non-retryable error (usually a wrong binding ID or secret) — fix the configuration, then **Replay dead letters** |
| "Enter a valid HTTPS Tajo webhook endpoint" | The endpoint must be HTTPS without embedded credentials |
| Test event delivered but nothing in Tajo | Check you pasted the binding ID from the same Tajo workspace/connection the endpoint belongs to |
### Next steps
- [WooCommerce connector reference](/docs/connectors/ecommerce/woocommerce/) — REST sync, webhook signature details, config keys
- [Customer sync](/docs/skills/data-sync/customer-sync/) — mapping WooCommerce customers into your system of record
- Configure abandoned-cart, post-purchase, and win-back automations in Tajo using `cart.updated`, `order.placed`, and `order.fulfilled` events
### Frequently asked questions
**How does Tajo connect to WooCommerce?**
Two halves: the Tajo for WooCommerce plugin captures engagement events such as orders, carts, refunds, reviews and form submissions inside WordPress and delivers them through a durable, signed outbox, while the WooCommerce REST connection reads customers, orders, products, coupons, refunds and reviews for historical import and ongoing sync.
**How do I install the Tajo for WooCommerce plugin, and which WordPress and PHP versions does it need?**
Download tajo-woocommerce-latest.zip from tajo.io/downloads/woocommerce/, unzip it into wp-content/plugins or upload it under Plugins, Add New, Upload Plugin, then activate Tajo for WooCommerce. You need WordPress 6.3 or later, PHP 7.4 or later and WooCommerce 7.0 or later; a SHA-256 checksum is published with each release.
**How do I configure the Tajo for WooCommerce plugin and test the connection?**
Under WooCommerce, Tajo, enter three values from your Tajo WordPress connection: the HTTPS Tajo endpoint, the binding ID and the signing secret of 32 to 256 characters. Then click Queue test event and Process now and confirm the connection.test event arrived in Tajo. Nothing goes in wp-config.php.
**What data does the WooCommerce plugin send to Tajo?**
Compact, privacy-minimized envelopes signed with HMAC-SHA256: engagement identity fields such as email, phone and local ids plus bounded event metadata, never names, postal addresses or IP addresses. Events cover customers, products, carts, orders, payments, refunds, subscriptions, content, comments and form submissions.
**Does checkout or a form submission count as marketing consent in the WooCommerce plugin?**
No. Account creation, checkout, purchase and generic form submissions are never treated as consent, and built-in events carry an empty consent list. Record explicit consent, for example from a checked newsletter box, with the tajo_engagement_emit hook and a consent.updated event.
**Why do my WooCommerce events stay queued or retrying?**
Queued means the endpoint, binding ID or secret is not saved yet. Retrying means the Tajo endpoint is unreachable from your host or WP-Cron is not running; if your host disables WP-Cron, call wp-cron.php from a real scheduler at least once a minute. Dead letters usually mean a wrong binding ID or secret: fix it and click Replay dead letters.
---
## Email & Messaging
Source: https://tajo.io/docs/email-messaging/
Send emails and SMS with the Brevo API
Send transactional emails, SMS, and manage your messaging campaigns through the Brevo API.
### Send Transactional Email
```javascript
const email = {
to: [{ email: "user@example.com", name: "John Doe" }],
sender: { email: "noreply@yoursite.com", name: "Your App" },
subject: "Welcome to our service!",
htmlContent: "
Welcome!
Thank you for signing up.
"
};
brevo.transactionalEmails.sendTransacEmail(email);
```
### SMS Messaging
```javascript
const sms = {
sender: "YourApp",
recipient: "+1234567890",
content: "Your verification code is: 123456"
};
brevo.transactionalSMS.sendTransacSms(sms);
```
### Features
- Transactional emails
- SMS messaging
- Email templates
- Delivery tracking
- Bounce handling
### Frequently asked questions
**How do I send a transactional email with the Brevo API?**
Call brevo.transactionalEmails.sendTransacEmail with a to list of recipients, a sender with email and name, a subject and htmlContent.
**How do I send an SMS with the Brevo API?**
Call brevo.transactionalSMS.sendTransacSms with a sender name, the recipient's number in international format, and the message content, for example a verification code.
**What messaging features does the Brevo API offer?**
Transactional emails, SMS messaging, email templates, delivery tracking and bounce handling.
---
## Send Email
Source: https://tajo.io/docs/email-messaging/transactional-email/send-email/
Send transactional emails via the Brevo API
Send individual transactional emails using the `/v3/smtp/email` endpoint.
### Endpoint
```http
POST /v3/smtp/email
```
### Request Body
#### Basic Email
```json
{
"sender": {
"name": "Your App",
"email": "noreply@yourapp.com"
},
"to": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"subject": "Welcome to our service!",
"htmlContent": "
"
}'
```
### Response
#### Success Response (201 Created)
```json
{
"messageId": "<202301151234.12345@smtp-relay.mailin.fr>"
}
```
#### Error Responses
**Invalid API Key (401)**
```json
{
"code": "unauthorized",
"message": "Invalid API key provided"
}
```
**Invalid Email Format (400)**
```json
{
"code": "invalid_parameter",
"message": "Invalid email format in 'to' field"
}
```
**Rate Limit Exceeded (429)**
```json
{
"code": "too_many_requests",
"message": "Rate limit exceeded"
}
```
### Parameters
#### Required Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `sender` | object | Sender information |
| `to` | array | Array of recipient objects |
| `subject` | string | Email subject line |
#### Optional Parameters
| Parameter | Type | Description |
|-----------|------|-------------|
| `htmlContent` | string | HTML content of the email |
| `textContent` | string | Text content of the email |
| `cc` | array | CC recipients |
| `bcc` | array | BCC recipients |
| `replyTo` | object | Reply-to address |
| `attachments` | array | File attachments |
| `params` | object | Template parameters |
| `tags` | array | Email tags for tracking |
| `headers` | object | Custom headers |
### Template Variables
Use template variables in your subject and content:
```json
{
"subject": "Welcome {{firstName}}!",
"htmlContent": "
Hello {{firstName}} {{lastName}}
",
"params": {
"firstName": "John",
"lastName": "Doe"
}
}
```
### Attachments
Include file attachments:
```json
{
"attachments": [
{
"content": "base64_encoded_content",
"name": "invoice.pdf"
},
{
"url": "https://example.com/document.pdf",
"name": "document.pdf"
}
]
}
```
### Best Practices
1. **Always include both HTML and text content** for better deliverability
2. **Use template variables** instead of concatenating content
3. **Include proper sender information** to avoid spam filters
4. **Add tags** for tracking and analytics
5. **Validate email addresses** before sending
6. **Handle errors gracefully** with retry logic
### Rate Limits
- **API rate limit**: on the general tier, which every plan gets, this endpoint allows 1,000 requests per second and 3,600,000 per hour. The advanced tier (Professional and Enterprise) allows 2,000 per second, and the extended tier (Enterprise) 6,000.
- **Sending volume**: how many emails you can send is set by your Brevo plan, separately from the rate limit.
See [Rate limits](/docs/rate-limits/) and Brevo's [rate limits page](https://developers.brevo.com/docs/api-limits).
### Tracking
Emails sent via this endpoint are automatically tracked for:
- Delivery status
- Open rates
- Click tracking
- Bounce handling
View detailed analytics in your Brevo dashboard under **Statistics** → **Transactional**.
### Related Endpoints
- Email Templates
- Attachments
- [Email Statistics](/docs/analytics-reporting/)
### Frequently asked questions
**Which endpoint sends a transactional email in Brevo?**
POST /v3/smtp/email at https://api.brevo.com, with Content-Type: application/json and your key in the api-key header. A successful send returns 201 Created with a messageId.
**Which fields are required to send an email through the Brevo API?**
Three: sender with name and email, to as an array of recipient objects, and subject. Optional fields are htmlContent, textContent, cc, bcc, replyTo, attachments, params, tags and headers.
**How do I use variables in a Brevo transactional email?**
Put placeholders such as {{firstName}} in the subject and content and pass the values in the params object, for example firstName and lastName. Use variables rather than concatenating content.
**How do I attach a file to a Brevo transactional email?**
Add an attachments array where each item has a name and either base64-encoded content or a url the file can be fetched from.
**Are transactional emails sent through the Brevo API tracked?**
Yes, automatically: delivery status, open rates, click tracking and bounce handling. Analytics are in the Brevo dashboard under Statistics, Transactional, and tags on each email help you filter them.
---
## REST API Endpoints
Source: https://tajo.io/docs/endpoints/rest-api/
Documentation for the REST API endpoints
**Demo Page** - This is a demo page to showcase the multi-tab documentation feature. This content is for illustration purposes only.
Our REST API provides endpoints for accessing and manipulating data. All endpoints return data in JSON format.
### Base URL
All API requests should be made to the following base URL:
```
https://api.example.com/v1
```
### Users Endpoints
#### Get All Users
```http
GET /users
```
Returns a list of all users. Supports pagination parameters.
**Query Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| page | integer | Page number (default: 1) |
| limit | integer | Number of records per page (default: 50, max: 100) |
| sort | string | Field to sort by (e.g., "name", "created_at") |
**Response:**
```json
{
"data": [
{
"id": "user_123",
"name": "John Doe",
"email": "john@example.com",
"created_at": "2023-01-15T08:30:00Z"
},
// More users...
],
"meta": {
"total": 250,
"page": 1,
"limit": 50
}
}
```
#### Get User by ID
```http
GET /users/{id}
```
Returns a single user by ID.
**Response:**
```json
{
"data": {
"id": "user_123",
"name": "John Doe",
"email": "john@example.com",
"created_at": "2023-01-15T08:30:00Z",
"profile": {
"bio": "Software developer",
"location": "New York",
"avatar_url": "https://example.com/avatars/john.jpg"
}
}
}
```
### Products Endpoints
#### Get All Products
```http
GET /products
```
Returns a list of all products. Supports filtering and pagination.
**Query Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| category | string | Filter by category |
| min_price | number | Filter by minimum price |
| max_price | number | Filter by maximum price |
| page | integer | Page number (default: 1) |
| limit | integer | Number of records per page (default: 50, max: 100) |
**Response:**
```json
{
"data": [
{
"id": "prod_123",
"name": "Example Product",
"description": "This is an example product",
"price": 49.99,
"category": "electronics"
},
// More products...
],
"meta": {
"total": 350,
"page": 1,
"limit": 50
}
}
```
### Error Handling
All endpoints follow standard HTTP status codes and include detailed error messages when appropriate:
| Status Code | Description |
|------------|-------------|
| 200 | OK - Request succeeded |
| 400 | Bad Request - Invalid parameters |
| 401 | Unauthorized - Authentication required |
| 403 | Forbidden - Insufficient permissions |
| 404 | Not Found - Resource doesn't exist |
| 429 | Too Many Requests - Rate limit exceeded |
| 500 | Internal Server Error - Server error occurred |
Error responses include a message explaining what went wrong:
```json
{
"error": {
"code": "invalid_parameter",
"message": "The parameter 'email' is not a valid email address",
"request_id": "req_abc123"
}
}
```
---
## enterprise
Source: https://tajo.io/docs/enterprise/
Documentation for enterprise
This section is under development. More content coming soon.
---
## event types
Source: https://tajo.io/docs/event-types/
Documentation for event types
This section is under development. More content coming soon.
---
## Create Event
Source: https://tajo.io/docs/events-engagement/create-event/
Track customer events for loyalty program engagement and personalization
Track customer interactions, purchases, and loyalty program activities to drive personalized engagement and rewards.
### Quick Start
#### Basic Event Tracking
```http
POST https://api.brevo.com/v3/events
Content-Type: application/json
api-key: YOUR_API_KEY
{
"email": "customer@example.com",
"event": "Purchase Completed",
"properties": {
"order_id": "ORD-2024-001",
"amount": 149.99,
"currency": "USD",
"products": ["Product A", "Product B"],
"points_earned": 150,
"loyalty_tier": "Gold"
}
}
```
#### Response
```json
{
"success": true,
"eventId": "evt_abc123"
}
```
### Loyalty Program Events
#### Purchase Events
Track purchases to award points and update loyalty status:
```json
{
"email": "customer@example.com",
"event": "Purchase Completed",
"properties": {
"order_id": "ORD-2024-001",
"order_total": 299.99,
"currency": "USD",
"payment_method": "Credit Card",
"products": [
{
"id": "PROD-001",
"name": "Premium Widget",
"category": "Electronics",
"price": 149.99,
"quantity": 2
}
],
"points_earned": 300,
"bonus_points": 50,
"points_multiplier": 1.2,
"loyalty_tier_before": "Silver",
"loyalty_tier_after": "Gold",
"tier_upgraded": true,
"shipping_cost": 9.99,
"discount_applied": 29.99,
"coupon_code": "SAVE10"
},
"eventdate": "2024-01-25T14:30:00Z"
}
```
#### Points Redemption
Track when customers redeem loyalty points:
```json
{
"email": "customer@example.com",
"event": "Points Redeemed",
"properties": {
"points_redeemed": 1000,
"reward_type": "Discount",
"reward_value": 50.00,
"reward_description": "$50 Off Next Purchase",
"coupon_generated": "LOYALTY50",
"expiry_date": "2024-03-25",
"remaining_points": 750,
"redemption_source": "Mobile App"
}
}
```
#### Account Activities
Track account-related activities:
```json
{
"email": "customer@example.com",
"event": "Account Created",
"properties": {
"signup_source": "Website",
"referral_code": "REF-12345",
"welcome_bonus": 500,
"initial_tier": "Bronze",
"marketing_consent": true,
"sms_consent": false,
"preferred_categories": ["Fashion", "Electronics"]
}
}
```
#### Engagement Events
Track customer engagement for personalization:
```json
{
"email": "customer@example.com",
"event": "Email Opened",
"properties": {
"campaign_id": "CAMP-001",
"campaign_name": "Weekly Offers",
"subject_line": "Exclusive Deals Just for You!",
"open_time": "2024-01-25T09:15:00Z",
"device": "Mobile",
"email_client": "Gmail",
"location": "New York, NY"
}
}
```
### Ecommerce Events for Tajo
#### Cart Events
```json
{
"event": "Product Added to Cart",
"properties": {
"product_id": "PROD-123",
"product_name": "Smart Watch",
"category": "Electronics",
"price": 299.99,
"cart_total": 459.98,
"cart_items_count": 2,
"potential_points": 460
}
}
```
```json
{
"event": "Cart Abandoned",
"properties": {
"cart_value": 459.98,
"items_count": 2,
"potential_points_lost": 460,
"abandonment_stage": "Checkout",
"time_in_cart": "25 minutes"
}
}
```
#### Browse Events
```json
{
"event": "Product Viewed",
"properties": {
"product_id": "PROD-456",
"product_name": "Wireless Headphones",
"category": "Electronics",
"price": 199.99,
"view_duration": "45 seconds",
"referrer": "Search Results",
"loyalty_discount_shown": true
}
}
```
#### Loyalty-Specific Events
```json
{
"event": "Tier Upgraded",
"properties": {
"previous_tier": "Silver",
"new_tier": "Gold",
"points_balance": 2500,
"benefits_unlocked": ["Free Shipping", "Priority Support"],
"next_tier": "Platinum",
"points_to_next_tier": 1500
}
}
```
```json
{
"event": "Reward Earned",
"properties": {
"reward_type": "Birthday Bonus",
"points_awarded": 500,
"trigger": "Birthday",
"total_points": 3000,
"tier_progress": 75
}
}
```
### Event Properties Guidelines
#### Required Properties
| Property | Type | Description |
|----------|------|-------------|
| `email` | String | Customer email (required) |
| `event` | String | Event name (required) |
| `properties` | Object | Event-specific data |
#### Recommended Properties for Loyalty
| Property | Type | Description |
|----------|------|-------------|
| `customer_id` | String | Internal customer ID |
| `loyalty_id` | String | Loyalty program ID |
| `points_balance` | Number | Current points after event |
| `loyalty_tier` | String | Current tier |
| `event_value` | Number | Monetary value of event |
### Advanced Event Tracking
#### Custom Event Properties
```json
{
"event": "Product Review Submitted",
"properties": {
"product_id": "PROD-789",
"rating": 5,
"review_length": "detailed",
"verified_purchase": true,
"points_earned": 25,
"review_bonus": true,
"helpful_votes": 0
}
}
```
#### Batch Event Creation
```json
{
"events": [
{
"email": "customer1@example.com",
"event": "Purchase Completed",
"properties": { "order_id": "ORD-001", "amount": 99.99 }
},
{
"email": "customer2@example.com",
"event": "Points Redeemed",
"properties": { "points_used": 500, "reward": "Free Shipping" }
}
]
}
```
### Error Handling
```json
{
"code": "invalid_event",
"message": "Event name must be a non-empty string",
"details": {
"field": "event",
"value": ""
}
}
```
### Best Practices for Tajo
1. **Consistent Event Names**: Use standard naming conventions
2. **Rich Properties**: Include loyalty-relevant data in every event
3. **Real-time Tracking**: Send events immediately after they occur
4. **Customer Journey**: Track complete purchase and engagement funnel
5. **Segmentation Data**: Include attributes that help with targeting
### Next Steps
- [Set up Event-based Automation](/docs/automation/)
- Track Email Engagement
- Configure Loyalty Workflows
- View Event Analytics
### Frequently asked questions
**How do I track a customer event in Brevo?**
POST to https://api.brevo.com/v3/events with your api-key header and a JSON body holding the contact's email, an event name such as Purchase Completed, and a properties object with the event's data. The response returns success and an eventId.
**Which fields are required when creating a Brevo event?**
email and event are required; properties carries the event-specific data such as order_id, amount, currency and products. An optional eventdate sets the event time.
**Can I send several events to Brevo in one request?**
Yes. Send an events array where each item has its own email, event name and properties.
**What kinds of events can I send to Brevo?**
Any named event: purchases, account creation, email opens, cart events such as Product Added to Cart and Cart Abandoned, browse events such as Product Viewed, and custom events like Product Review Submitted. Use consistent event names and send events immediately after they occur.
**Why does Brevo return invalid_event?**
The event name is empty or not a string. The error names the field and the rejected value in details; send a non-empty event string.
---
## Initial Theme Setup
Source: https://tajo.io/docs/getting-started/configuration/
Get started with Tajo!
1. To get started, first install all necessary packages with `npm install` or `pnpm install`, then run an initial build to make sure the setup works with `npm run build` or `pnpm build`.
2. Copy the Pagefind build (for site search) to be available for the dev environment. This varies depending on your OS. I've created a few commands to help.
- For Windows, run `npm run winsearch`
- For OSX or Linux, run `npm run osxsearch`
3. Next, you'll want to configure your site i18n setup (one language, or multiple). Simply run the command `npm run docs:config-i18n` and follow the script instructions to get setup!
4. Now you can setup the site to your liking!
### Code Intros
I have created a few code tours to help introduce you to the codebase. You will need the extension [Code Tour](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) to view them in VSCode or another IDE.
### Code Structure
The code is structured with most items under the `src/docs` directory. This makes it easy to drop that entire folder into an existing project and to add docs functionality in a matter of minutes.
### Configuration Options
Overall site configuration is done in the `src/docs/config/` folder. Most settings are inside individual language folders in order to make it easier to handle translations.
#### Site Settings
The `src/docs/config/siteSettings.json.ts` file is used to configure the site settings. These include things like whether to enable view transitions, whether to enable animations, and whether to show copy link buttons for docs headings.
#### Site Data
The `src/docs/config/[language]/siteData.json.ts` file is used to configure the site data. This includes things like the site title, description, social links, and default image.
#### Nav Data
Configure your navigation data for the top navbar in the `src/docs/config/[language]/navData.json.ts` file.
#### Sidebar Layout
Configure the order for your documentation sections in the `src/docs/config/[language]/sidebarNavData.json.ts` file.
#### Robots
For robots like Google to see the correct sitemap, you will want to edit the `public/robots.txt` file to use your website domain.
### More Resources
### General Astro Info
Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name.
There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components.
Any static assets, like images, can be placed in the `public/` directory. I also frequently use `src/assets` for images when using Astro assets for image optimization.
#### Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
| :------------------------ | :----------------------------------------------- |
| `npm install` | Installs dependencies |
| `npm run dev` | Starts local dev server at `localhost:4321` |
| `npm run build` | Build your production site to `./dist/` |
| `npm run preview` | Preview your build locally, before deploying |
| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` |
| `npm run astro -- --help` | Get help using the Astro CLI |
#### Want to learn more?
Feel free to check [the documentation](https://docs.astro.build) or jump into the [Discord server](https://astro.build/chat).
---
## Welcome to Tajo
Source: https://tajo.io/docs/getting-started/
Tajo is an agentic integration builder. Describe a sync between two SaaS tools and its agent builds the field maps, the reverse ETL jobs and the MCP tools that run it.
Tajo is an agentic integration builder. You describe, in plain language, the sync you want between two SaaS tools. Tajo's agent builds it: the field maps, the reverse ETL jobs that move the data, and MCP tools your AI client can call. An MCP UI lets you review, approve and run each sync from inside the AI client you already use.
Tajo is not tied to any vendor. Shopify, HubSpot, Stripe, Brevo and any documented REST API are connectors. The builder, the approvals and the MCP layer stay the same whichever tools you pair.
### What Tajo builds
- **Field maps** - A readable mapping from the source tool's fields to the destination's. You approve it before anything runs.
- **Reverse ETL** - Contacts, orders, products and events move from the system that records them into the tools that act on them, on a schedule or as they happen.
- **MCP tools** - Every integration is also exposed as MCP tools, so Claude, ChatGPT or your own agent reads and writes through one governed layer instead of raw API keys.
- **MCP UI** - Approve field maps, watch sync runs and fix failures from an interface that opens inside your AI client.
### Governed by default
Consent, budget and approval rules run before any write. Every decision lands in an audit history you can check.
### How a first sync works
### Where to go next
- [Integration layer](/docs/integrations/) - How Tajo connects a source tool to a destination tool, with a guide for each documented pair
- [MCP and agents](/docs/mcp/) - How integrations are exposed as MCP tools and how agents are defined
- [A worked example: Shopify to Brevo](/docs/platform-integration/tajo-brevo-integration) - One complete sync, end to end
Connecting Brevo? The [Quick Start Guide](/docs/quick-start/) shows how to get Brevo API credentials and make a first API call.
### Frequently asked questions
**What is Tajo?**
Tajo is an agentic integration builder. You describe, in plain language, the sync you want between two SaaS tools, and Tajo's agent builds it: the field maps, the reverse ETL jobs that move the data, and MCP tools your AI client can call. An MCP UI lets you review, approve and run each sync.
**What does Tajo build for an integration?**
Four things: a readable field map from source fields to destination fields, approved before anything runs; reverse ETL jobs that move contacts, orders, products and events on a schedule or as they happen; MCP tools so an AI client reads and writes through one governed layer; and an MCP UI to approve maps, watch runs and fix failures.
**Is Tajo tied to one vendor like Shopify or Brevo?**
No. Tajo is not tied to any vendor. Shopify, HubSpot, Stripe, Brevo and any documented REST API are connectors; the builder, the approvals and the MCP layer stay the same whichever tools you pair.
**How does a first sync work in Tajo?**
Pick a source and a destination, describe the sync in plain language such as send new Shopify customers and their orders to Brevo every hour, review and approve the field map the agent proposes in the MCP UI, then run it once, check the result and put it on a schedule.
**How does Tajo govern what an integration writes?**
Consent, budget and approval rules run before any write, and every decision lands in an audit history you can check.
**Can Claude or ChatGPT use my Tajo integrations?**
Yes. Every integration is also exposed as MCP tools, so Claude, ChatGPT or your own agent reads and writes through one governed layer instead of raw API keys, and the MCP UI opens inside your AI client.
---
## Integrating with an Existing Theme
Source: https://tajo.io/docs/getting-started/integrating/
Learn how to integrate Tajo with an existing project
This theme is designed to work seamlessly with other Tailwind CSS v4 projects.
### Required Steps
### Optional Steps
#### Fonts
This theme uses the **Inter** font by default. It is recommended to install the font locally from [fontsource](https://fontsource.org/fonts/inter/install).
Then in your `fonts.css` file add the following:
```css title="src/styles/fonts.css"
/* inter-latin-wght-normal */
@font-face {
font-family: "Inter Variable";
font-style: normal;
font-display: swap;
font-weight: 100 900;
src: url(@fontsource-variable/inter/files/inter-latin-wght-normal.woff2)
format("woff2-variations");
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304,
U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF,
U+FFFD;
}
```
##### Alternate Fonts
You can also use different fonts. Just make sure you add the necessary fonts to your `fonts.css` file, and update the `font-family` property in your `src/docs/styles/docs-global.css` file.
You should also preload your font in the `src/docs/layouts/BaseHead.astro` component, similar to the Inter font.
```astro {2,5}
---
import InterVariable from "@fontsource-variable/inter/files/inter-latin-wght-normal.woff2";
---
```
---
## BigCommerce + Brevo Integration
Source: https://tajo.io/docs/integrations/bigcommerce-brevo/
What Tajo can do with BigCommerce and Brevo today. Tajo reads BigCommerce store data, but a customer sync into Brevo cannot be published yet, because Tajo cannot prove marketing consent for BigCommerce customers.
## BigCommerce + Brevo
Tajo has a BigCommerce connector. It reads customers, orders, products and addresses through the BigCommerce REST API, with your store hash and an API access token. The Tajo team sets up the token with you. There is no self-serve token field yet.
### What You Cannot Do Today
A sync of BigCommerce customers into Brevo contacts cannot be published yet. Tajo has no consent policy for BigCommerce, so it cannot show that a customer agreed to marketing. Tajo refuses any rule that writes contacts to Brevo without that proof.
Tajo does not receive BigCommerce webhooks.
### What You Can Do
If you need BigCommerce data in Brevo, [tell the team](/contact) where your store records marketing consent. That is the piece a BigCommerce sync is missing.
### Doing It Yourself
BigCommerce has an MCP server in beta. It is a storefront server: it searches the catalog, manages carts and hands off to checkout for shoppers. It does not read your customer list, so it cannot feed a sync into Brevo. See BigCommerce's [MCP documentation](https://docs.bigcommerce.com/developer/api-reference/mcp/overview).
Brevo's own MCP server is described in [Brevo MCP Server](/docs/mcp/brevo-mcp-server).
### Next Steps
- [Shopify + Brevo](/docs/integrations/shopify-brevo)
- [Custom API + Brevo](/docs/integrations/custom-api-brevo)
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/)
---
## Custom API + Brevo Integration
Source: https://tajo.io/docs/integrations/custom-api-brevo/
Evaluate a custom source for Brevo. A connector definition is not a live connection; verify authorization, consent, preview, approval, and a controlled run.
## Custom API + Brevo
Tajo has source connector definitions and rule-building code, but a definition is not an authorized connection or a live sync. Check the source's [integration guide](/docs/integrations) for current evidence and consent requirements. The [HubSpot guide](/docs/integrations/hubspot-brevo) illustrates a pilot implementation awaiting live verification. If your source is missing, [tell the team](/contact) which system, API, and consent evidence the workflow needs.
### How a Sync Is Built
This implemented workflow applies only when the source connector and an authorized connection are available. Confirm the exact path with Tajo before relying on it:
1. Ask the **Brevo Integration Architect** for a specific source, destination, field map, and consent rule.
2. Review the proposed rule against the source schema and the consent evidence it can actually read.
3. Validate the map and request publish approval. The bounded preview reads at most 10 source records and writes nothing to Brevo.
4. A person approves the exact rule; only then can it be published. Verify a controlled live run and its failure handling separately.
### What a Sync Needs to Be Published
A rule that writes contacts or events to Brevo must carry Tajo's consent filter. The source has to record marketing consent, and Tajo has to know how to read it. When it cannot, the rule is refused.
The HubSpot connector has a proposed consent mapping but no verified live production sync. Stripe, WooCommerce and BigCommerce have no verified publishable Tajo contact path here; this is a statement about Tajo's current evidence, not whether those platforms can store consent. For any source, identify where marketing consent is recorded and ask for a live preview of the proposed rule before relying on it.
### Doing It Yourself
Brevo runs an official MCP server. Connect it to Claude and Claude can create and update contacts, lists and campaigns in your account. See [Brevo MCP Server](/docs/mcp/brevo-mcp-server) for the token and the client setup.
Each Brevo module also has its own endpoint, such as `https://mcp.brevo.com/v1/brevo_contacts/mcp`. Connect only the modules your task needs. The token behind each still has full access to your account.
For the source side, look for an MCP server for your system in the [MCP Registry](https://registry.modelcontextprotocol.io), or build one against the [MCP specification](https://modelcontextprotocol.io/). In that setup nothing checks consent for you. Send Brevo only people who agreed to marketing.
### Next Steps
- [Integration Layer Overview](/docs/integrations), source status and verification checks
- [Shopify + Brevo](/docs/integrations/shopify-brevo)
- [Brevo MCP Server](/docs/mcp/brevo-mcp-server), Brevo's modules and client setup
---
## HubSpot + Brevo Integration
Source: https://tajo.io/docs/integrations/hubspot-brevo/
Plan a HubSpot contacts to Brevo sync, including field ownership, identity, consent, and the checks needed before a live connection.
## HubSpot + Brevo
Tajo has a HubSpot connector implementation and a draft contact mapping for Brevo. A self-serve HubSpot connection is not available yet. The connector has offline test coverage, but a live HubSpot install and production sync have not been verified. [Contact the team](/contact) if you need this route; ask for a live connection and sync preview before relying on it.
### Define the contact sync
Start with one direction: HubSpot owns the selected CRM fields, and Brevo receives the fields needed for email. Keep HubSpot's contact ID as a stable source key. Email is useful for finding a Brevo contact, but addresses can change or be shared; decide how an address change updates the existing match before the first run.
| HubSpot source | Proposed Brevo destination |
|---------|-------|
| email | `email` |
| first name, last name | `FIRSTNAME`, `LASTNAME` |
| phone, company | `PHONE`, `COMPANY` |
| job title, lifecycle stage | `JOB_TITLE`, `HUBSPOT_LIFECYCLE` |
| contact ID | `HUBSPOT_ID` |
This is a proposed map, not a promise that every field is configured in your Brevo account. Confirm the destination attributes and decide which system owns each field. If Brevo also edits a mapped field, set a conflict rule so a later sync cannot silently overwrite that edit.
Marketing eligibility needs its own rule. Check the relevant HubSpot marketing subscription status and global opt-out for each address, then check Brevo's suppression state before any marketing use. An absent or unknown subscription status is not proof of opt-in. Plan how an opt-out in either system stops future sends and prevents a later CRM update from reactivating the address. Test a newly subscribed contact, an unsubscribed contact, and an address change.
### Verify before use
Ask the team to demonstrate an authorized HubSpot connection, a field and consent preview with sample records, a repeat run that creates no duplicates, and a changed record reaching Brevo. Confirm the update schedule, retry behavior, and a way to inspect failures for your account. If a reverse flow is needed, give it separate field ownership and loop prevention rules. Company and deal syncs need their own mapping and proof.
The [data sync guide](/resources/help/getting-started/understanding-data-sync/) explains the rule concepts. For a separate integration you operate yourself, see HubSpot's [official API documentation](https://developers.hubspot.com/docs/api-reference/overview) and Brevo's [MCP server guide](/docs/mcp/brevo-mcp-server). Such a flow needs its own consent, identity, and retry checks.
---
## Integration Layer
Source: https://tajo.io/docs/integrations/
Explore proposed Tajo source paths into Brevo. Check connector availability, consent requirements, and a live preview before planning a sync.
Tajo has an integration builder that can draft a field map and sync rule for a source connector. A usable sync also needs an available connector, an authorized source connection, a valid consent path, and a verified execution route. The guides below describe proposed mappings and current evidence; a guide or connector definition alone does not prove that a live sync is available in your workspace.
### How It Works
Where the connector and authorized connection are available, the implemented rule workflow is:
1. **Describe** the desired source, fields, and consent rule to the Brevo Integration Architect agent.
2. **Review** its proposed field map and rule against the source's actual data and consent evidence.
3. **Request a preview** of at most 10 source records. The preview writes nothing to Brevo.
4. **Approve** the exact rule before publishing. Then verify a controlled live run separately.
### Source status
| Source | Sync into Brevo | Why |
|--------|-----------------|-----|
| **Shopify** | Pilot connector and proposed customer/order mappings; live installation and production sync unverified | Verify store authorization, consent fields, and a controlled live run. The separate [Brevo PushOwl route](/blog/brevo-shopify-integration/) has its own setup. |
| **HubSpot** | Pilot implementation; self-serve connection and live production sync unverified | Marketing subscription and opt-out checks need live verification |
| **Webflow** | Pilot connector and proposed form-to-contact mapping; live installation and production sync unverified | Verify the form's opt-in evidence and a controlled live run. |
| **Stripe** | No publishable Tajo contact sync verified | Tajo needs a verified marketing-consent path for the selected source records. |
| **WooCommerce** | No publishable Tajo contact sync verified | Tajo needs a verified marketing-consent path for the selected source records. |
| **BigCommerce** | No publishable Tajo contact sync verified | Tajo needs a verified marketing-consent path for the selected source records. |
| **Salesforce Commerce Cloud** | No publishable Tajo contact sync verified | Tajo needs a verified mapping and marketing-consent path. |
### Integration Guides
#### [Shopify + Brevo](/docs/integrations/shopify-brevo)
Proposed customer and order mappings, consent checks, and the live installation still to verify.
#### [HubSpot + Brevo](/docs/integrations/hubspot-brevo)
Proposed contact mapping and consent checks; live connection and production sync remain unverified.
#### [Stripe + Brevo](/docs/integrations/stripe-brevo)
What Tajo reads from Stripe, and why a Stripe sync into Brevo cannot be published today.
#### [Webflow + Brevo](/docs/integrations/webflow-brevo)
Proposed form-to-contact mapping and the opt-in and live connection checks still required.
#### [Salesforce Commerce Cloud + Brevo](/docs/integrations/salesforce-commerce-brevo)
What Tajo reads from SFCC, and what a sync into Brevo still needs.
#### [BigCommerce + Brevo](/docs/integrations/bigcommerce-brevo)
What Tajo reads from BigCommerce, and why a customer sync into Brevo cannot be published yet.
#### [WooCommerce + Brevo](/docs/integrations/woocommerce-brevo)
What Tajo reads from WooCommerce, and why a customer sync into Brevo cannot be published today.
#### [Custom API + Brevo](/docs/integrations/custom-api-brevo)
Another system: check for a Tajo connector, what a sync needs to be published, and how to wire it yourself.
### Doing It Yourself
The guides also describe separate MCP or API routes. The [Brevo MCP Server](/docs/mcp/brevo-mcp-server) can help with direct account tasks, but using provider tools does not create a durable Tajo sync or enforce this builder's consent filter. Verify consent before sending contacts to Brevo.
### Next Steps
- [Shopify + Brevo](/docs/integrations/shopify-brevo), proposed mapping and verification checks
- [Shopify integration guide](/docs/ecommerce-platforms/shopify/), setup details to verify against a live store
- [Brevo MCP Server Setup](/docs/mcp/brevo-mcp-server), a separate direct-tool route
---
## Salesforce Commerce Cloud + Brevo Integration
Source: https://tajo.io/docs/integrations/salesforce-commerce-brevo/
What Tajo can do with Salesforce Commerce Cloud and Brevo today. Tajo reads SFCC products, orders and customers, but there is no ready sync into Brevo.
## Salesforce Commerce Cloud + Brevo
Tajo has a Salesforce Commerce Cloud (SFCC) connector. It reads products, orders and customers through SFCC's API, with an access token. The Tajo team sets up the token with you. There is no self-serve sign-in yet.
### What You Cannot Do Today
There is no SFCC template and no sync of SFCC customers into Brevo contacts. Tajo has no consent policy for SFCC, so it cannot show that a customer agreed to marketing. Tajo refuses any rule that writes contacts to Brevo without that proof.
Tajo does not receive SFCC webhooks.
### What You Can Do
If you are moving from SFCC to Brevo, or need SFCC data in Brevo, [tell the team](/contact) what you want to send and where your customers' marketing consent is recorded.
### Doing It Yourself
Salesforce publishes an MCP server for B2C Commerce, `@salesforce/b2c-dx-mcp`. It is a developer tool for building on the platform, not a way to read your customers or orders. See Salesforce's [B2C developer tooling documentation](https://salesforcecommercecloud.github.io/b2c-developer-tooling/mcp/).
Brevo's own MCP server is described in [Brevo MCP Server](/docs/mcp/brevo-mcp-server).
### Next Steps
- [Shopify + Brevo](/docs/integrations/shopify-brevo)
- [Custom API + Brevo](/docs/integrations/custom-api-brevo)
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/)
---
## Shopify + Brevo Integration
Source: https://tajo.io/docs/integrations/shopify-brevo/
Shopify to Brevo is a Tajo pilot path. Review configured webhook and sync-rule behavior, then verify store authorization, consent and a controlled live run.
## Shopify + Brevo
Tajo has a pilot Shopify connector, app code and proposed Brevo sync templates. Offline tests cover parts of this path, but a fresh store installation, live webhook delivery and production sync have not been verified by this review. The UI, template and MCP steps below describe implemented design requiring live verification, not features assumed available in every workspace. If your store connection is authorized and the consent path passes, two implemented components can move data:
- **The Tajo Shopify app** contains webhook handlers for customers, orders, checkouts, products, collections and stock. Confirm delivery and destination writes in a controlled live test before relying on immediate updates.
- **Sync rules** can map selected Shopify records to Brevo in batches. The proposed rule, consent filter, preview and approval must be verified against the authorized store before publishing.
The [Shopify integration guide](/docs/ecommerce-platforms/shopify/) lists every webhook and what it writes to Brevo.
### Building a Sync
When the Shopify connector and authorized store binding are available, the rule builder can follow this path. Verify the preview and a controlled live run before treating it as an operational sync.
1. In Tajo, open **Agents** and ask the **Brevo Integration Architect**, for example: "Send Shopify customers who accepted email marketing to Brevo as contacts."
2. The agent inspects the Shopify connector. It sees field names and types, never customer values.
3. It proposes a rule: the Shopify resource, the Brevo action, a field map and a filter. It validates the field map and dry-runs the draft, then saves it.
4. **Request publish approval** runs a preview. It reads at most 10 records from your store, writes nothing to Brevo and records counts only.
5. A person approves the exact rule on the **Approvals** page. Then the rule can be published.
Two templates are defined in code. If exposed in your authorized workspace, find them under **Connections > Syncs and mappings > New sync from template**:
| Template | What it does |
|----------|--------------|
| **Shopify customers -> Brevo contacts** | Maps email, first and last name, phone, total spent, order count, the email opt-in, tags, the Shopify ID and the created and updated dates into Brevo contact attributes. Only customers subscribed to email marketing, and not suppressed, are sent. |
| **Shopify orders → Brevo orders** | Records orders in Brevo for revenue reporting, for buyers who accepted marketing at checkout. It adds nobody to a list. |
The configured runtime schedules contact sync rules every 15 minutes by default. An active, published orders rule uses the same interval while retaining the buyer marketing opt-in filter. Its first scheduled window sends no older orders; later windows use the saved cursor. Past orders need an explicit run, such as **Test run (1 batch)**. Editing a rule returns it to draft for preview and approval. These are configured behaviors, not proof of a live store run: verify timing, cursor recovery and actual Brevo writes in your authorized store.
### Shopify and Brevo over MCP
Tajo defines Shopify and Brevo MCP routes for compatible hosts. Verify authenticated host access and the current tool set in your workspace before relying on them:
```bash
claude mcp add --transport http tajo-shopify https://alto.tajo.io/mcp/connectors/shopify
claude mcp add --transport http tajo-brevo https://alto.tajo.io/mcp/connectors/brevo
```
When enabled, the host opens Tajo sign-in for early-access accounts. Check read results and approval behavior in your own workspace; tool exposure does not prove a durable Shopify-to-Brevo sync. The [Shopify integration guide](/docs/ecommerce-platforms/shopify/) describes the proposed tools.
### Doing It Yourself
Without Tajo, you can connect Brevo's own MCP server to Claude and work with your Brevo account directly. See [Brevo MCP Server](/docs/mcp/brevo-mcp-server). Shopify's [Dev MCP server](https://shopify.dev/docs/apps/build/ai-toolkit) searches Shopify's API docs and schemas. It does not read your store's data.
### Next Steps
- [Shopify integration guide](/docs/ecommerce-platforms/shopify/), configured webhooks, rules and MCP tools
- [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/), every scope and every write
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/), how sync rules behave
- [HubSpot + Brevo](/docs/integrations/hubspot-brevo)
---
## Stripe + Brevo Integration
Source: https://tajo.io/docs/integrations/stripe-brevo/
What Tajo can do with Stripe and Brevo today. Tajo reads Stripe data, but a Stripe contact sync into Brevo cannot be published, because Stripe records no marketing consent.
## Stripe + Brevo
Tajo has a Stripe connector. It reads customers, charges, subscriptions and invoices with a Stripe secret key. The Tajo team sets up the key with you. There is no self-serve key field yet.
### What You Cannot Do Today
A sync of Stripe customers into Brevo contacts cannot be published. Stripe records no marketing consent on its customers, so no customer can be shown to have agreed to marketing. Tajo refuses any rule that writes contacts or events to Brevo without that proof.
The same holds for payment events. Sending Stripe charges to Brevo as events needs the same consent filter.
### What You Can Do
If the same customers buy through a Shopify store, the Shopify sync carries their consent into Brevo. See [Shopify + Brevo](/docs/integrations/shopify-brevo).
If you need Stripe data in Brevo, [tell the team](/contact) what you want to send.
### Doing It Yourself
Stripe publishes an official MCP server: a remote server at `https://mcp.stripe.com` and a local one, `npx -y @stripe/mcp --api-key=YOUR_STRIPE_SECRET_KEY`. Stripe's [MCP documentation](https://docs.stripe.com/mcp) covers which keys it accepts.
Pair it with Brevo's MCP server, described in [Brevo MCP Server](/docs/mcp/brevo-mcp-server). The consent question does not go away in that setup: you are responsible for sending Brevo only people who agreed to marketing.
### Next Steps
- [Shopify + Brevo](/docs/integrations/shopify-brevo)
- [HubSpot + Brevo](/docs/integrations/hubspot-brevo)
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/)
---
## Webflow + Brevo Integration
Source: https://tajo.io/docs/integrations/webflow-brevo/
Webflow to Brevo is a Tajo pilot path. Review the form-to-contact mapping, opt-in filter and approval flow, then verify an authorized live run.
## Webflow + Brevo
Tajo has a pilot Webflow connector and proposed form-to-contact rule. Offline tests cover the mapping, but a fresh Webflow installation and production sync have not been verified by this review. The UI, template and MCP steps below describe implemented design requiring live verification, not features assumed available in every workspace. A submitted form is not consent on its own. The proposed filter sends only submissions with an accepted opt-in field; verify that field and a controlled live run before relying on the path.
### Connecting Webflow
If Webflow connection is available in your workspace, open **Connections**, choose Webflow under **Connect a source** and authorize Tajo in Webflow. Confirm the resulting source binding before building a rule.
### Building the Sync
When the authorized Webflow binding and consent field are available, the rule builder can follow this path. Verify the preview and a controlled live run before treating it as operational.
1. In Tajo, open **Agents** and ask the **Brevo Integration Architect**, for example: "Send newsletter sign-ups from my Webflow site to Brevo."
2. The agent inspects the Webflow connector. It sees field names and types, never submission values.
3. It proposes a rule with a field map and the consent filter, validates the field map and dry-runs the draft, then saves it.
4. **Request publish approval** runs a preview. It reads at most 10 submissions, writes nothing to Brevo and records counts only.
5. A person approves the exact rule on the **Approvals** page. Then the rule can be published.
A **Webflow form_submissions -> Brevo contacts** template is defined in code. If exposed in your authorized workspace, find it under **Connections > Syncs and mappings > New sync from template**. It proposes this map:
| Webflow form field | Brevo |
|--------------------|-------|
| `email`, `Email` or `e-mail` | `email` |
| `firstName`, `first_name` or `First Name` | `FIRSTNAME` |
| `lastName`, `last_name` or `Last Name` | `LASTNAME` |
| `phone` | `PHONE` |
| submission ID | `WEBFLOW_SUBMISSION_ID` |
| site ID | `WEBFLOW_SITE_ID` |
| submission date | `WEBFLOW_SUBMITTED_AT` |
The implementation recognizes candidate fields named `marketingConsent`, `marketing_consent`, `optIn`, `opt_in`, `newsletter`, `subscribe` or `Subscribe`, and parses values such as `true`, `yes`, `on`, `1`, `checked` or `subscribed`. These names and values are not consent evidence on their own. Review the form label, purpose and captured choice for the actual source; unknown or ambiguous evidence must stop marketing sync. Use double opt-in when the workflow requires it.
The configured runtime checks for new submissions every 15 minutes by default. Editing the rule returns it to draft for preview and approval. Verify the schedule, consent filter and destination writes in a controlled live run.
### Webflow over MCP
Tajo defines a Webflow MCP route at `https://alto.tajo.io/mcp/connectors/webflow` for early-access accounts. Its code includes reads for sites, forms, submissions, CMS collections and items, products and orders. Verify authenticated host access and the current tool set in your workspace; MCP exposure does not prove a durable Webflow-to-Brevo sync.
```bash
claude mcp add --transport http tajo-webflow https://alto.tajo.io/mcp/connectors/webflow
```
### Doing It Yourself
Webflow runs an official MCP server at `https://mcp.webflow.com/mcp`, with OAuth. Add it to Claude Code with:
```bash
claude mcp add --transport http webflow https://mcp.webflow.com/mcp
```
See Webflow's [MCP documentation](https://developers.webflow.com/mcp/reference/overview). Pair it with Brevo's MCP server, described in [Brevo MCP Server](/docs/mcp/brevo-mcp-server). Check the opt-in field yourself before you add anyone to Brevo.
### Next Steps
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/), how sync rules behave
- [HubSpot + Brevo](/docs/integrations/hubspot-brevo)
- [Shopify + Brevo](/docs/integrations/shopify-brevo)
---
## WooCommerce + Brevo Integration
Source: https://tajo.io/docs/integrations/woocommerce-brevo/
What Tajo can do with WooCommerce and Brevo today. Tajo reads WooCommerce store data, but a customer sync into Brevo cannot be published, because WooCommerce records no marketing opt-in.
## WooCommerce + Brevo
Tajo has a WooCommerce connector. It reads customers, orders, products, product categories, coupons, refunds and product reviews through the WooCommerce REST API, with a consumer key and secret. It also receives WooCommerce webhooks, signed with HMAC, for orders, customers, products and coupons. The Tajo team sets up the keys with you. There is no self-serve key field yet.
### What You Cannot Do Today
A sync of WooCommerce customers into Brevo contacts cannot be published. WooCommerce records no marketing opt-in for its customers, so no customer can be shown to have agreed to marketing. Tajo refuses any rule that writes contacts to Brevo without that proof. Tajo does not read plugin data as consent.
### What You Can Do
If your sign-up form runs on Webflow, or your customers also buy on Shopify, those syncs carry consent into Brevo. See [Webflow + Brevo](/docs/integrations/webflow-brevo) and [Shopify + Brevo](/docs/integrations/shopify-brevo).
If you need WooCommerce data in Brevo, [tell the team](/contact) where your store records marketing consent.
### Doing It Yourself
WooCommerce ships its own MCP integration, in developer preview. You turn it on with the `mcp_integration` feature flag, and it authenticates with WordPress application passwords. See WooCommerce's [MCP documentation](https://developer.woocommerce.com/docs/features/mcp/) for the endpoint and the client setup.
Pair it with Brevo's MCP server, described in [Brevo MCP Server](/docs/mcp/brevo-mcp-server). The consent question does not go away in that setup: you are responsible for sending Brevo only people who agreed to marketing.
### Next Steps
- [Shopify + Brevo](/docs/integrations/shopify-brevo)
- [Webflow + Brevo](/docs/integrations/webflow-brevo)
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/)
---
## marketing tools
Source: https://tajo.io/docs/marketing-tools/
Documentation for marketing tools
This section is under development. More content coming soon.
---
## Agent Specification
Source: https://tajo.io/docs/mcp/agent-specification/
What a Tajo agent is made of: a role, instructions, a fixed tool list where each tool carries a permission tier, optional skills, and routines.
**In short:** a Tajo agent is a role in your workspace with instructions, a fixed list of tools and optional skills. Each tool has a permission tier. The tier, not the agent, decides whether a call runs, waits for your approval, or is refused.
### The parts of an agent
| Part | What it is |
|---|---|
| Name and role | What the agent is called and the role slug it runs as. The 15 built-in roles are reserved. |
| Instructions | The prompt the agent works from. |
| Tools | The only actions the agent can take. An agent cannot call a tool that is not on its list. |
| Skills | Written guidance the agent loads, such as `email-craft` or `compliance-reviewer`. A skill adds knowledge, never a new action. |
| Budget | An optional monthly spend cap. |
| Routines | Requests that run the agent again on a schedule. |
There is no agent file format. You create and edit agents in the app.
### Permission tiers
Every call an agent makes goes through one check before it runs. The check stops everything when the workspace is paused or over its hard budget limit. Otherwise the tool's tier decides:
| Tier | What happens | Examples |
|---|---|---|
| Allowed | The call goes ahead | Checking a draft for compliance, drafting a template, computing a segment, running active syncs |
| Needs a standing grant | Runs only if you granted this agent that tool; otherwise it asks you | Capturing a screenshot of a web page |
| Needs approval | The run pauses until you approve this exact call | Scheduling a send |
An approval covers the exact input you saw. If the agent changes one field after you approve, the approval no longer matches and the call waits again.
### Gates that hold whatever the tier
- **Publishing a sync.** The Brevo Integration Architect activates a sync rule only with the approval you gave for it. A request expires after 30 minutes.
- **Consent before data moves.** A sync that writes contacts or events to Brevo cannot be published unless it filters on consent and suppression.
- **Consent before a message goes out.** A marketing send needs an opt-in on the channel it uses. Unknown means no send.
- **Large sends.** Any send to 50 or more contacts waits for approval.
### Routines
A request on the home screen with a schedule in it, such as *"every Monday"*, becomes a routine that runs the same agent again. Schedule words map to fixed times in UTC; the table is in [Tajo 101](/docs/guides/tajo-101/#routines). Routines started by an event, such as a new order, are not built yet.
### The built-in roles
| Role | Main tools |
|---|---|
| Brevo Integration Architect | Inspect the source, sample records, propose and validate a field map, dry-run, save a draft, request publish approval, activate with that approval |
| Sync Operator | Run active sync rules |
| Segment Builder | Compute a segment |
| Compliance Reviewer | Check a send for compliance, request approval |
| Engagement Designer | Draft campaigns and templates, check a draft's output, request approval |
| Performance Analyst | Analyse workspace performance, compute a segment, draft a campaign, request approval |
| Orchestrator | Draft campaigns and templates, compute segments, request approval, schedule a send |
What each one never does: [Tajo agents](/docs/guides/agents/).
### Frequently asked questions
**What is a Tajo agent?**
A role in your workspace with instructions, a fixed list of tools and optional skills. Each tool has a permission tier. The tier, not the agent, decides whether a call runs, waits for your approval, or is refused.
**Is there a Tajo agent file format?**
No. There is no agent file format. You create and edit agents in the app. An agent has a name and role, instructions, tools, skills, an optional monthly budget and routines.
**What are the permission tiers for agent tools?**
Allowed: the call goes ahead. Needs a standing grant: it runs only if you granted this agent that tool, otherwise it asks you. Needs approval: the run pauses until you approve this exact call, for example scheduling a send. Before any tier applies, the check stops everything when the workspace is paused or over its hard budget limit.
**What happens if an agent changes a call after I approve it?**
An approval covers the exact input you saw. If the agent changes one field after you approve, the approval no longer matches and the call waits again.
**Which gates hold whatever the tool's tier?**
Publishing a sync needs the approval you gave for it, and a request expires after 30 minutes. A sync that writes contacts or events to Brevo cannot be published unless it filters on consent and suppression. A marketing send needs an opt-in on the channel it uses, and unknown means no send. Any send to 50 or more contacts waits for approval.
**Can a Tajo agent run on a schedule?**
Yes, as a routine. A request on the home screen with a schedule in it, such as every Monday, becomes a routine that runs the same agent again at fixed UTC times. Routines started by an event, such as a new order, are not built yet.
**What are the built-in agent roles?**
Seven: Brevo Integration Architect, Sync Operator, Segment Builder, Compliance Reviewer, Engagement Designer, Performance Analyst and Orchestrator. Their role names are reserved.
---
## Brevo MCP Server
Source: https://tajo.io/docs/mcp/brevo-mcp-server/
Connect Brevo's own hosted MCP server to Claude, Cursor or another MCP client. It works without Tajo, and Tajo agents do not use it.
Brevo provides an official hosted MCP server at `mcp.brevo.com` that exposes 27 modules, contacts, campaigns, deals, templates, WhatsApp, SMS, and more, as tools any AI agent can invoke. No local installation required.
This page is about Brevo's server, which you connect to your own MCP client. Tajo agents do not use it; see [How this relates to Tajo](#how-this-relates-to-tajo).
The Brevo MCP Server uses the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/), an open standard by Anthropic that connects AI assistants to external tools and services.
### Quick Start
#### 1. Get Your MCP Token
Brevo MCP uses a dedicated MCP token (not a standard API key):
1. Log in to [app.brevo.com](https://app.brevo.com)
2. Go to **Account** > **SMTP & API** > **API Keys**
3. Click **Generate a new API key** and toggle on **Create MCP server API key**
4. Copy and store your token securely
Your MCP token grants full read/write access to your Brevo account. Never commit it to version control or share it publicly.
#### 2. Connect Your AI Tool
#### 3. Test the Connection
Once connected, ask your AI assistant:
```
> How many contacts do I have?
> Create an email campaign for my product launch
> Show me deals in the Negotiation stage
> Add a contact to my newsletter list
```
### Available Servers
The main server at `/v1/brevo/mcp` includes all 27 modules. For better response quality with focused use cases, connect to individual servers that give your AI a smaller, more targeted toolset.
#### Main Server
| Endpoint | Description |
|----------|-------------|
| `https://mcp.brevo.com/v1/brevo/mcp` | All features combined (27 modules) |
#### Individual Servers
Connect only the modules your client needs. A smaller tool list is easier for a model to choose from.
##### Contacts & CRM
| Server | Endpoint | Purpose |
|--------|----------|---------|
| **contacts** | `/v1/brevo_contacts/mcp` | Manage contacts and lists |
| **lists** | `/v1/brevo_lists/mcp` | Manage contact lists |
| **segments** | `/v1/brevo_segments/mcp` | Manage contact segments |
| **attributes** | `/v1/brevo_attributes/mcp` | Manage contact attributes |
| **groups** | `/v1/brevo_groups/mcp` | Manage contact groups |
| **contact_import_export** | `/v1/brevo_contact_import_export/mcp` | Bulk import/export contacts |
##### Campaigns & Messaging
| Server | Endpoint | Purpose |
|--------|----------|---------|
| **email_campaign_management** | `/v1/brevo_email_campaign_management/mcp` | Create and manage email campaigns |
| **campaign_analytics** | `/v1/brevo_campaign_analytics/mcp` | View campaign performance |
| **templates** | `/v1/brevo_templates/mcp` | Manage email templates |
| **transac_templates** | `/v1/brevo_transac_templates/mcp` | Manage transactional email templates |
| **sms_campaigns** | `/v1/brevo_sms_campaigns/mcp` | Create and send SMS campaigns |
| **whatsapp_campaigns** | `/v1/brevo_whatsapp_campaigns/mcp` | Create and send WhatsApp campaigns |
| **whatsapp_management** | `/v1/brevo_whatsapp_management/mcp` | Configure WhatsApp settings |
##### Sales CRM
| Server | Endpoint | Purpose |
|--------|----------|---------|
| **deals** | `/v1/brevo_deals/mcp` | Manage CRM deals |
| **companies** | `/v1/brevo_companies/mcp` | Manage CRM companies |
| **tasks** | `/v1/brevo_tasks/mcp` | Manage CRM tasks |
| **pipelines** | `/v1/brevo_pipelines/mcp` | Configure CRM pipelines |
| **notes** | `/v1/brevo_notes/mcp` | Add notes to contacts and deals |
##### Account & Settings
| Server | Endpoint | Purpose |
|--------|----------|---------|
| **senders** | `/v1/brevo_senders/mcp` | Manage sender identities |
| **domains** | `/v1/brevo_domains/mcp` | Manage sender domains |
| **ips** | `/v1/brevo_ips/mcp` | Manage dedicated IPs |
| **accounts** | `/v1/brevo_accounts/mcp` | Manage account and sub-accounts |
| **users** | `/v1/brevo_users/mcp` | Manage users and permissions |
| **webhooks_management** | `/v1/brevo_webhooks_management/mcp` | Configure webhooks |
| **external_feeds** | `/v1/brevo_external_feeds/mcp` | Manage RSS feeds |
| **folders** | `/v1/brevo_folders/mcp` | Organise campaigns into folders |
| **processes** | `/v1/brevo_processes/mcp` | Monitor background processes |
All endpoints use the base URL `https://mcp.brevo.com`.
### Scoping tools for your own client
Connect only the servers a task needs. A client that only works on Brevo's sales CRM, for example, needs deals, companies and pipelines:
```json
{
"mcpServers": {
"brevo_deals": {
"url": "https://mcp.brevo.com/v1/brevo_deals/mcp",
"headers": { "Authorization": "Bearer your-token" }
},
"brevo_companies": {
"url": "https://mcp.brevo.com/v1/brevo_companies/mcp",
"headers": { "Authorization": "Bearer your-token" }
},
"brevo_pipelines": {
"url": "https://mcp.brevo.com/v1/brevo_pipelines/mcp",
"headers": { "Authorization": "Bearer your-token" }
}
}
}
```
The token behind each of these still has full access to your Brevo account. Scoping narrows what the model sees, not what the token allows.
### How this relates to Tajo
Brevo's server and Tajo are separate. Tajo agents do not connect to Brevo's MCP server, and nothing on this page needs a Tajo workspace.
Inside Tajo, Brevo is reached through Tajo's own Brevo connector. Writes from Tajo's agents go through sync rules and sends you approve, and Tajo's own MCP tools for Brevo stage each write until it is approved. See [MCP & Agents](/docs/mcp/) and [Tajo agents](/docs/guides/agents/).
### Troubleshooting
#### "Command not found: npx"
Install [Node.js](https://nodejs.org/). The `npx mcp-remote` bridge is required for Claude Desktop.
#### Tools not appearing
- Restart your application completely (not just reload)
- Verify your JSON has no syntax errors (trailing commas, missing brackets)
- Check that your MCP token has no extra spaces
#### Authentication errors
- Verify your MCP token is still active at **Brevo Dashboard > SMTP & API**
- Confirm the `Authorization` header is formatted as `Bearer ` with a space
### Next Steps
- [MCP & Agents](/docs/mcp/): what Tajo runs, and the MCP tools it serves
- [Tajo agents](/docs/guides/agents/): each agent, what it never does, what waits for you
- [Brevo Official Docs](https://developers.brevo.com/docs/mcp-protocol): full Brevo MCP documentation
### Frequently asked questions
**What is the Brevo MCP server, and do I need to install anything to use it?**
An official hosted MCP server at mcp.brevo.com that exposes 27 modules, contacts, campaigns, deals, templates, WhatsApp, SMS and more, as tools any AI agent can invoke. Nothing is installed locally; the main endpoint is https://mcp.brevo.com/v1/brevo/mcp.
**How do I get a Brevo MCP token?**
Log in to app.brevo.com, go to Account, SMTP & API, API Keys, click Generate a new API key and toggle on Create MCP server API key. It is a dedicated MCP token, not a standard API key, and it grants full read and write access, so never commit or share it.
**How do I connect Brevo's MCP server to Claude Desktop?**
Add a brevo entry under mcpServers in claude_desktop_config.json that runs npx mcp-remote https://mcp.brevo.com/v1/brevo/mcp with the header Authorization: Bearer and your token in the BREVO_MCP_TOKEN env value, then restart Claude Desktop. Node.js must be installed.
**Can I connect Brevo MCP to Cursor, VS Code or Windsurf?**
Yes. Each takes the URL https://mcp.brevo.com/v1/brevo/mcp with an Authorization Bearer header: Cursor in mcp.json, VS Code as an http server in .vscode/mcp.json, and Windsurf as serverUrl in mcp_config.json. Claude Code adds it with claude mcp add --transport http and the same Authorization header, and claude mcp list verifies it.
**Do Tajo agents use the Brevo MCP server?**
No. Brevo's server and Tajo are separate, and nothing on this page needs a Tajo workspace. Inside Tajo, Brevo is reached through Tajo's own Brevo connector, and Tajo's own MCP tools for Brevo stage each write until it is approved.
**Should I connect the whole Brevo MCP server or individual modules?**
Connect only the servers a task needs. A client that only works on Brevo's sales CRM, for example, needs /v1/brevo_deals/mcp, /v1/brevo_companies/mcp and /v1/brevo_pipelines/mcp. A smaller tool list is easier for a model to choose from. The token behind each still has full access to your Brevo account: scoping narrows what the model sees, not what the token allows.
**Why are Brevo MCP tools not showing up in my AI app, or failing to authenticate?**
Restart the application completely, check the JSON for trailing commas or missing brackets, and make sure the token has no extra spaces. For authentication errors, confirm the token is still active under SMTP & API and that the header reads Bearer followed by a space and the token. Command not found: npx means Node.js is missing.
---
## Building Agents
Source: https://tajo.io/docs/mcp/building-agents/
How to hire your own agent in a Tajo workspace: role, instructions, tools from a fixed list, skills, and a schedule. Sends keep their approval gate.
**In short:** you hire an agent in the app under **Team**. You give it a role and instructions, then pick its tools and skills from a fixed list. Whatever you pick, a send it schedules waits for your approval.
Most work does not need a new agent. Every workspace starts with 15 built-in agents. The nine that sync work runs through cover building a sync, running it, building lists, drafting, reviewing and reporting: see [Tajo agents](/docs/guides/agents/). Hire your own when you want the same job done the same way every time, with instructions you wrote.
### Hire an agent
### Run it on a schedule
Ask on the home screen with a schedule in the request, for example *"Every Monday, draft a welcome email for contacts who opted in last week and ask me before sending."* The request becomes a routine. Schedule words map to fixed UTC times, listed in [Tajo 101](/docs/guides/tajo-101/#routines).
Routines started by an event, such as a new order, are not built yet.
### What a new agent cannot do
- **Send without you.** Scheduling a send always pauses for your approval, and the approval covers only the exact send you saw.
- **Reach contacts who did not opt in.** A marketing send needs an opt-in on its channel.
- **Use tools outside the list.** There is no agent file format and no way to hand an agent arbitrary API tools.
- **Build or publish a sync.** That is the Brevo Integration Architect's job, and publishing waits for your approval.
### Access
Tajo workspaces are not open for self-serve sign-up yet. [Sign up for early access](/docs/guides/agents/#early-access).
### Frequently asked questions
**How do I create my own Tajo agent?**
Hire it in the app under Team: open Team, then New. Name it and give it a role, a short slug such as welcome_series. Write its instructions, pick its tools and skills from a fixed list, and set a monthly budget if you want a cap. The seven built-in roles are reserved, and a workspace holds one agent per role.
**Do I need to build a new agent?**
Most work does not. The seven built-in agents cover building a sync, running it, building lists, drafting, reviewing and reporting. Hire your own when you want the same job done the same way every time, with instructions you wrote.
**Which tools can an agent I hire use?**
Four, from a fixed list: request human approval, compute segment, draft template, and schedule dispatch, which queues an email, SMS or WhatsApp send and always waits for your approval.
**What do skills do for an agent?**
Skills are written guidance, such as email craft, email compliance or deliverability. They change how the agent works, not what it can do.
**Can I run my agent on a schedule?**
Yes. Put a schedule in a home-screen request, for example every Monday, and it becomes a routine at fixed UTC times. Routines started by an event, such as a new order, are not built yet.
**What can a new agent not do?**
Send without you, since scheduling a send always pauses for your approval of that exact send. Reach contacts who did not opt in on the channel. Use tools outside the list: there is no agent file format and no way to hand an agent arbitrary API tools. Build or publish a sync, which is the Brevo Integration Architect's job.
---
## MCP & Agents
Source: https://tajo.io/docs/mcp/
What runs in Tajo today: the agents in every workspace, the MCP tools Tajo serves for each connector, and where Brevo's own MCP server fits.
**In short:** Tajo builds integrations between the systems you use. Agents inside a Tajo workspace build each sync, run it and work on the data it lands. MCP is how a model outside Tajo, such as Claude or ChatGPT, reaches the same connectors. Brevo's own MCP server is a separate product that Tajo agents do not use.
### Agents in a workspace
Every workspace starts with 15 agents. Nine of them are the agents sync work runs through. The Brevo Integration Architect builds a sync rule, the Sync Operator runs it, and seven more work on the contacts and orders it lands: Segment Builder, Compliance Reviewer, Engagement Designer, Performance Analyst, Orchestrator, Win-back and Customer Intelligence.
Two rules hold for all of them. A sync goes live only with your approval. A send goes out only with your approval, and only to contacts who opted in on that channel.
One card per agent, with what each never does: [Tajo agents](/docs/guides/agents/). How they fit around one sync: [Tajo 101](/docs/guides/tajo-101/).
### What an agent is made of
An agent is a role in your workspace, not a file you write. It has instructions, a fixed list of tools, and optional skills. Each tool carries a permission tier, and the tier decides what happens when the agent calls it. The details are on [Agent specification](/docs/mcp/agent-specification). Hiring your own is on [Building agents](/docs/mcp/building-agents).
### MCP tools Tajo serves
Tajo serves each connector to MCP hosts as a small, fixed set of tools rather than one tool per API endpoint. The Brevo profile is eight tools that cover the whole Brevo API:
| Purpose | Tools |
|---|---|
| Find an operation | `brevo_search`, `brevo_describe` |
| Read | `brevo_query`, one read request per call, with capped results |
| Write | `brevo_propose` stages a declared Brevo action; `brevo_apply` runs it once it is approved |
| Common tasks | `brevo_customer`, `brevo_report`, `brevo_health` |
No write reaches Brevo from this profile except through `brevo_apply`, after approval. Shopify and Webflow have their own profiles of the same shape, built around each integration's own actions.
These endpoints come with a Tajo workspace. Workspaces are not open for self-serve sign-up yet: [sign up for early access](/docs/guides/agents/#early-access).
### Brevo's own MCP server
Brevo runs a hosted MCP server of its own. You can connect it to Claude, Cursor or another MCP client with a Brevo token, and it works without Tajo. Setup is on [Brevo MCP Server](/docs/mcp/brevo-mcp-server). Tajo agents do not connect to it.
### Frequently asked questions
**What agents does a Tajo workspace start with?**
Seven. The Brevo Integration Architect builds a sync rule, the Sync Operator runs it, and five more work on the contacts it lands: Segment Builder, Compliance Reviewer, Engagement Designer, Performance Analyst and Orchestrator.
**What rules hold for every Tajo agent?**
Two. A sync goes live only with your approval. A send goes out only with your approval, and only to contacts who opted in on that channel.
**What is a Tajo agent made of?**
An agent is a role in your workspace, not a file you write. It has instructions, a fixed list of tools, and optional skills. Each tool carries a permission tier, and the tier decides what happens when the agent calls it.
**Which MCP tools does Tajo serve for Brevo?**
A small, fixed set rather than one tool per API endpoint: eight tools that cover the whole Brevo API. brevo_search and brevo_describe find an operation, brevo_query reads, brevo_propose stages a declared Brevo action and brevo_apply runs it once it is approved, and brevo_customer, brevo_report and brevo_health cover common tasks. No write reaches Brevo from this profile except through brevo_apply, after approval. Shopify and Webflow have their own profiles of the same shape.
**Do Tajo agents use Brevo's own MCP server?**
No. Brevo runs a hosted MCP server of its own. You can connect it to Claude, Cursor or another MCP client with a Brevo token, and it works without Tajo. Tajo agents do not connect to it.
**How do I get Tajo's MCP endpoints?**
They come with a Tajo workspace. Workspaces are not open for self-serve sign-up yet; sign up for early access.
---
## Messaging API
Source: https://tajo.io/docs/messaging-api/
Send emails, SMS, and WhatsApp messages through Brevo API
The Messaging API allows you to send transactional and marketing messages across multiple channels including email, SMS, and WhatsApp.
### Key Features
- **Transactional Emails**: Send automated emails triggered by user actions
- **Transactional SMS**: Send SMS messages for notifications and alerts
- **WhatsApp Integration**: Send WhatsApp messages through the API
- **Template Management**: Create and manage message templates
- **Inbound Parsing**: Handle inbound email responses
### Getting Started
To start using the Messaging API, you'll need:
1. A valid Brevo API key
2. Verified sender domain or phone number
3. Message templates (optional but recommended)
### API Endpoints
#### Transactional Emails
- `POST /v3/smtp/email` - Send a transactional email
- `GET /v3/smtp/templates` - Get email templates
- `POST /v3/smtp/templates` - Create email template
#### Transactional SMS
- `POST /v3/transactionalSMS/sms` - Send SMS message
- `GET /v3/transactionalSMS/templates` - Get SMS templates
#### WhatsApp
- `POST /v3/whatsApp/send` - Send WhatsApp message
- `GET /v3/whatsApp/templates` - Get WhatsApp templates
### Next Steps
- [Send your first transactional email](/docs/messaging-api/transactional-emails/send-transactional-email)
- [Set up SMS messaging](/docs/messaging-api/transactional-sms/send-sms)
- Configure WhatsApp integration
### Frequently asked questions
**What can I send with the Brevo Messaging API?**
Transactional and marketing messages over email, SMS and WhatsApp, plus template management and inbound email parsing.
**Which endpoints send messages in the Brevo API?**
POST /v3/smtp/email for a transactional email, POST /v3/transactionalSMS/sms for an SMS, and POST /v3/whatsApp/send for a WhatsApp message. Templates are read from GET /v3/smtp/templates, GET /v3/transactionalSMS/templates and GET /v3/whatsApp/templates.
**What do I need before using the Brevo Messaging API?**
A valid Brevo API key, a verified sender domain or phone number, and, optionally but recommended, message templates.
---
## Send Transactional Email
Source: https://tajo.io/docs/messaging-api/transactional-emails/send-transactional-email/
Send automated transactional emails through Brevo's API for customer loyalty engagement
Send personalized transactional emails to your customers for loyalty program updates, order confirmations, reward notifications, and engagement campaigns.
### Quick Start
#### Basic Email Request
```http
POST https://api.brevo.com/v3/smtp/email
Content-Type: application/json
api-key: YOUR_API_KEY
{
"sender": {
"name": "Tajo Loyalty",
"email": "loyalty@yourdomain.com"
},
"to": [
{
"email": "customer@example.com",
"name": "Customer Name"
}
],
"subject": "Your loyalty points have been updated!",
"htmlContent": "
Loyalty Update
You earned 100 points from your recent purchase!
",
"textContent": "Loyalty Update: You earned 100 points from your recent purchase!"
}
```
#### Response
```json
{
"messageId": "<202301021030.5678901234@domain.com>"
}
```
### Loyalty Program Use Cases
#### Welcome Email for New Customers
```json
{
"sender": {
"name": "Tajo Loyalty Program",
"email": "welcome@yourdomain.com"
},
"to": [
{
"email": "{{params.email}}",
"name": "{{params.name}}"
}
],
"templateId": 1,
"params": {
"name": "John Doe",
"email": "john@example.com",
"welcomeBonus": "500",
"loyaltyTier": "Bronze"
}
}
```
#### Points Balance Update
```json
{
"subject": "Points Balance Update - {{params.pointsEarned}} Points Added",
"params": {
"customerName": "John Doe",
"pointsEarned": "150",
"totalPoints": "1,250",
"transactionType": "Purchase",
"orderNumber": "ORD-2024-001"
}
}
```
#### Reward Redemption Confirmation
```json
{
"subject": "Reward Redeemed Successfully",
"params": {
"rewardName": "10% Off Next Purchase",
"pointsUsed": "1000",
"remainingPoints": "250",
"couponCode": "SAVE10NOW",
"expiryDate": "2024-03-15"
}
}
```
### Parameters
| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `sender` | Object | Yes | Sender information |
| `to` | Array | Yes | Recipient list (max 50) |
| `subject` | String | Yes | Email subject line |
| `htmlContent` | String | No | HTML email content |
| `textContent` | String | No | Text email content |
| `templateId` | Integer | No | Template ID (alternative to content) |
| `params` | Object | No | Template parameters |
| `headers` | Object | No | Custom headers |
| `attachment` | Array | No | File attachments |
### Advanced Features for Tajo
#### Customer Segmentation
```json
{
"to": [
{
"email": "premium@example.com",
"name": "Premium Customer"
}
],
"params": {
"loyaltyTier": "Premium",
"personalizedOffers": [
"Exclusive 20% off luxury items",
"Free premium shipping"
]
}
}
```
#### A/B Testing Setup
```json
{
"subject": "{{params.subjectVariant}}",
"params": {
"subjectVariant": "Limited Time: Double Points Weekend!",
"contentVariant": "premium",
"testGroup": "A"
}
}
```
### Error Handling
```json
{
"code": "invalid_parameter",
"message": "Email address is invalid",
"details": {
"field": "to[0].email",
"value": "invalid-email"
}
}
```
### Next Steps
- Set up Email Templates
- Configure SMS Integration
- Track Email Events
- Loyalty Program Integration
### Frequently asked questions
**How do I send a transactional email with the Brevo API?**
POST a JSON body to https://api.brevo.com/v3/smtp/email with your key in the api-key header. Required fields are sender with name and email, a to array of recipients, and subject; add htmlContent and textContent, or a templateId with params. The response returns a messageId.
**Which parameters does the Brevo send email endpoint accept?**
sender, to and subject are required; to holds at most 50 recipients. Optional fields are htmlContent, textContent, templateId as an alternative to content, params for template values, headers for custom headers, and attachment for files.
**Can I use a template instead of HTML content in a Brevo transactional email?**
Set templateId to the template's integer id and pass the values in params, for example name and loyaltyTier. Template placeholders such as {{params.name}} are filled from that object, and subject lines can reference params too.
**How many recipients can I put in the to field of a Brevo transactional email?**
At most 50 in the to array of a single request.
**What does an invalid_parameter error from the Brevo email endpoint mean?**
A field failed validation. The response names the field in details, for example to[0].email with the rejected value, and a message such as Email address is invalid.
---
## Send SMS
Source: https://tajo.io/docs/messaging-api/transactional-sms/send-sms/
Send transactional SMS messages for loyalty program notifications and customer engagement
Send personalized SMS messages to customers for loyalty program updates, order notifications, and time-sensitive offers.
### Quick Start
#### Basic SMS Request
```http
POST https://api.brevo.com/v3/transactionalSMS/sms
Content-Type: application/json
api-key: YOUR_API_KEY
{
"type": "transactional",
"unicodeEnabled": false,
"sender": "TajoLoyalty",
"recipient": "+1234567890",
"content": "Hi John! You've earned 150 points from your recent purchase. Your total: 1,250 points. Redeem at tajo.com/rewards"
}
```
#### Response
```json
{
"reference": "sms_abc123",
"messageId": "msg_def456"
}
```
### Loyalty Program SMS Templates
#### Points Earned Notification
```json
{
"type": "transactional",
"sender": "TajoRewards",
"recipient": "+1234567890",
"content": "🎉 Great news {{contact.FIRSTNAME}}! You earned {{params.pointsEarned}} points from order #{{params.orderNumber}}. Total: {{params.totalPoints}} points. Shop more at {{params.storeUrl}}",
"params": {
"pointsEarned": "200",
"orderNumber": "ORD-2024-001",
"totalPoints": "1,450",
"storeUrl": "shop.tajo.com"
}
}
```
#### Tier Upgrade Alert
```json
{
"content": "🌟 Congratulations {{contact.FIRSTNAME}}! You've been upgraded to {{params.newTier}} status! Enjoy {{params.benefits}}. Your new point balance: {{params.totalPoints}}",
"params": {
"newTier": "Gold",
"benefits": "free shipping & exclusive offers",
"totalPoints": "2,500"
}
}
```
#### Reward Redemption Confirmation
```json
{
"content": "✅ Reward redeemed! {{params.rewardName}} - {{params.pointsUsed}} points used. Coupon: {{params.couponCode}} (expires {{params.expiryDate}}). Remaining: {{params.remainingPoints}} points",
"params": {
"rewardName": "20% Off",
"pointsUsed": "1000",
"couponCode": "SAVE20NOW",
"expiryDate": "Mar 15",
"remainingPoints": "450"
}
}
```
#### Order Status Updates
```json
{
"content": "📦 Your order #{{params.orderNumber}} has {{params.status}}! {{params.details}} Track: {{params.trackingUrl}}",
"params": {
"orderNumber": "ORD-2024-001",
"status": "shipped",
"details": "Arriving in 2-3 business days",
"trackingUrl": "track.tajo.com/ORD-2024-001"
}
}
```
### Personalized Campaign SMS
#### Birthday Special Offers
```json
{
"type": "marketing",
"sender": "TajoBday",
"recipient": "+1234567890",
"content": "🎂 Happy Birthday {{contact.FIRSTNAME}}! Here's a special gift: {{params.birthdayBonus}} bonus points + {{params.discountCode}} for {{params.discountAmount}} off! Valid until {{params.expiryDate}}",
"params": {
"birthdayBonus": "500",
"discountCode": "BIRTHDAY25",
"discountAmount": "25%",
"expiryDate": "end of month"
}
}
```
#### Abandoned Cart Recovery
```json
{
"content": "🛒 Hi {{contact.FIRSTNAME}}, you left {{params.itemCount}} items in your cart worth {{params.cartValue}}. Complete your purchase and earn {{params.potentialPoints}} points! Continue: {{params.cartUrl}}",
"params": {
"itemCount": "3",
"cartValue": "$299.97",
"potentialPoints": "300",
"cartUrl": "tajo.com/cart"
}
}
```
#### Flash Sale Alerts
```json
{
"content": "⚡ {{contact.FIRSTNAME}}, FLASH SALE: {{params.saleDetails}}! {{params.loyaltyTier}} members get {{params.bonusPoints}} bonus points! Shop now: {{params.saleUrl}} ({{params.timeLeft}} left)",
"params": {
"saleDetails": "50% off electronics",
"loyaltyTier": "Gold",
"bonusPoints": "double",
"saleUrl": "tajo.com/flash",
"timeLeft": "6 hours"
}
}
```
### Advanced SMS Features
#### Template-based SMS
```json
{
"type": "transactional",
"templateId": 123,
"params": {
"customerName": "John Doe",
"pointsBalance": "2,350",
"nextReward": "Free shipping at 2,500 points"
}
}
```
#### Scheduled SMS
```json
{
"type": "transactional",
"sender": "TajoRemind",
"recipient": "+1234567890",
"content": "⏰ Reminder: Your {{params.pointsExpiring}} points expire in {{params.daysLeft}} days! Use them at tajo.com/rewards",
"scheduledAt": "2024-01-30T09:00:00Z",
"params": {
"pointsExpiring": "500",
"daysLeft": "7"
}
}
```
#### Unicode Support
```json
{
"type": "transactional",
"unicodeEnabled": true,
"content": "🎊 ¡Felicidades {{contact.FIRSTNAME}}! Has ganado {{params.points}} puntos 💎",
"params": {
"points": "150"
}
}
```
### SMS Campaign Segmentation
#### Tier-based Messaging
```json
{
"type": "marketing",
"content": "{{#if contact.LOYALTY_TIER == 'Platinum'}}💎 VIP Alert: Early access to our sale + triple points!{{else}}🌟 Loyalty member: Get double points on your next purchase!{{/if}}",
"webUrl": "https://tajo.com/sale"
}
```
#### Geo-targeted SMS
```json
{
"content": "📍 {{contact.FIRSTNAME}}, there's a Tajo store near you! Visit {{params.nearestStore}} and show this text for {{params.inStoreBonus}} bonus points!",
"params": {
"nearestStore": "123 Main St, NYC",
"inStoreBonus": "100"
}
}
```
### Compliance and Best Practices
#### Opt-in Verification
```json
{
"type": "transactional",
"content": "Welcome to Tajo SMS alerts! Reply YES to confirm you want loyalty updates and exclusive offers. Reply STOP to opt out anytime. Msg & data rates may apply."
}
```
#### Opt-out Handling
```json
{
"type": "transactional",
"content": "You've been unsubscribed from Tajo SMS alerts. You'll still receive important order updates. To rejoin, text START. Questions? Contact support@tajo.com"
}
```
### Error Handling
```json
{
"code": "invalid_recipient",
"message": "Phone number format invalid",
"details": {
"recipient": "123-456-7890",
"expectedFormat": "+1234567890"
}
}
```
```json
{
"code": "message_too_long",
"message": "SMS content exceeds character limit",
"details": {
"length": 180,
"limit": 160,
"segments": 2
}
}
```
### SMS Analytics
Track key metrics:
- Delivery rates
- Click-through rates (for links)
- Conversion rates
- Opt-out rates
- Customer engagement scores
### Cost Optimization
#### Character Count Management
```json
{
"content": "Hi {{contact.FIRSTNAME}}! +{{params.points}}pts from order #{{params.orderNum}}. Total: {{params.total}}pts. tajo.com/rewards",
"estimatedSegments": 1,
"characterCount": 89
}
```
#### Bulk SMS for Segments
```json
{
"recipients": [
{
"phone": "+1234567890",
"params": { "name": "John", "points": "150" }
},
{
"phone": "+1234567891",
"params": { "name": "Jane", "points": "200" }
}
],
"content": "Hi {{params.name}}! You earned {{params.points}} points!"
}
```
### Integration with Tajo Platform
1. **Order Confirmations**: Automatic SMS for purchase confirmations
2. **Point Notifications**: Real-time point balance updates
3. **Tier Changes**: Immediate notifications for tier upgrades
4. **Expiry Alerts**: Proactive point expiration warnings
5. **Promotional Campaigns**: Targeted offers based on behavior
### Best Practices
1. **Keep it Short**: SMS is limited, be concise but engaging
2. **Personalize**: Use customer data for relevant messaging
3. **Timing**: Send at optimal times for your audience
4. **Clear CTAs**: Include clear next steps or links
5. **Compliance**: Always include opt-out instructions
6. **Test**: A/B test different message formats
### Next Steps
- Set up SMS Templates
- Configure SMS Automation
- Manage SMS Contact Lists
- Track SMS Analytics
### Frequently asked questions
**Which endpoint sends a transactional SMS with the Brevo API?**
POST to https://api.brevo.com/v3/transactionalSMS/sms with your api-key header and a JSON body with type transactional, the sender name, the recipient in international format such as +1234567890, and the content. The response returns a reference and a messageId.
**Can I personalize a Brevo SMS with contact data?**
Yes. Use placeholders such as {{contact.FIRSTNAME}} for contact attributes and {{params.orderNumber}} for values you pass in a params object with the request. A templateId with params sends a stored SMS template instead of inline content.
**How do I schedule an SMS for later in Brevo?**
Add scheduledAt with an ISO 8601 timestamp such as 2024-01-30T09:00:00Z to the request body.
**Why does Brevo reject my SMS recipient?**
The invalid_recipient error means the phone number format is wrong; Brevo expects the international format with a plus sign and country code, for example +1234567890, not 123-456-7890.
**Can I send an SMS with emoji or non-Latin characters, and what if it is longer than 160 characters?**
Brevo returns message_too_long with the length, the 160-character limit and the number of segments the message would need. Keep messages short, and set unicodeEnabled to true when the content uses accented characters or emoji.
**What is the difference between transactional and marketing SMS in Brevo?**
The type field: transactional for order updates and notifications, marketing for promotional sends such as birthday offers and flash sales. Marketing messages need opt-in and must carry an opt-out instruction such as Reply STOP.
---
## multi account
Source: https://tajo.io/docs/multi-account/
Documentation for multi account
This section is under development. More content coming soon.
---
## personalization
Source: https://tajo.io/docs/personalization/
Documentation for personalization
This section is under development. More content coming soon.
---
## Tajo-Brevo Integration Guide
Source: https://tajo.io/docs/platform-integration/tajo-brevo-integration/
Complete guide to integrating Tajo loyalty platform with Brevo for seamless customer engagement
This comprehensive guide walks you through integrating your Tajo loyalty platform with Brevo to create powerful, automated customer engagement campaigns.
### Overview
The Tajo-Brevo integration enables you to:
- **Sync customer data** in real-time between platforms
- **Automate loyalty campaigns** based on customer behavior
- **Track engagement** across email, SMS, and WhatsApp
- **Segment customers** by loyalty tier and purchase behavior
- **Trigger personalized messages** for key loyalty events
### Prerequisites
Before starting the integration, ensure you have:
- **Tajo account** with loyalty program configured
- **Brevo account** with API access
- **Valid API keys** for both platforms
- **Webhook endpoints** set up for real-time sync
- **SSL certificate** for secure data transmission
### Step 1: Authentication Setup
#### Generate Brevo API Key
1. Log into your Brevo account
2. Go to **Account & Plan > API Keys**
3. Click **Generate a new API key**
4. Name it "Tajo Integration"
5. Copy and securely store the key
```bash
# Store in environment variables
export BREVO_API_KEY="xkeysib-your-api-key-here"
export TAJO_WEBHOOK_SECRET="your-webhook-secret"
```
#### Configure Tajo Integration
In your Tajo dashboard:
1. Go to **Settings > Integrations**
2. Select **Brevo** from the list
3. Enter your Brevo API key
4. Configure sync settings
```json
{
"brevo_api_key": "xkeysib-your-api-key-here",
"sync_frequency": "real-time",
"sync_contacts": true,
"sync_orders": true,
"sync_events": true,
"loyalty_attributes": [
"LOYALTY_POINTS",
"LOYALTY_TIER",
"TOTAL_SPENT",
"LAST_PURCHASE"
]
}
```
### Step 2: Customer Data Synchronization
#### Contact Sync Configuration
Set up automatic contact synchronization to keep customer data current:
```javascript
// Sync customer on registration
async function syncCustomerToBrevo(customer) {
const brevoData = {
email: customer.email,
attributes: {
FIRSTNAME: customer.firstName,
LASTNAME: customer.lastName,
PHONE: customer.phone,
LOYALTY_ID: customer.loyaltyId,
LOYALTY_POINTS: customer.points,
LOYALTY_TIER: customer.tier,
SIGNUP_DATE: customer.createdAt,
TOTAL_SPENT: customer.totalSpent,
PREFERRED_CATEGORIES: customer.categories,
BIRTHDAY: customer.birthday
},
listIds: [getListForTier(customer.tier)]
};
const response = await fetch('https://api.brevo.com/v3/contacts', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'api-key': process.env.BREVO_API_KEY
},
body: JSON.stringify(brevoData)
});
return response.json();
}
```
#### Purchase Event Sync
Automatically sync purchases to trigger loyalty campaigns:
```javascript
// Sync order completion
async function syncOrderToBrevo(order, customer) {
// Create order in Brevo
const orderData = {
id: order.id,
email: customer.email,
products: order.items.map(item => ({
id: item.productId,
name: item.name,
quantity: item.quantity,
price: item.price,
category: item.category
})),
revenue: order.total,
date: order.createdAt
};
await fetch('https://api.brevo.com/v3/ecommerce/orders', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'api-key': process.env.BREVO_API_KEY
},
body: JSON.stringify(orderData)
});
// Create loyalty event
const eventData = {
email: customer.email,
event: 'Purchase Completed',
properties: {
order_id: order.id,
amount: order.total,
points_earned: order.pointsEarned,
loyalty_tier: customer.tier,
tier_upgraded: order.tierUpgraded,
products: order.items.map(i => i.name).join(', ')
}
};
await fetch('https://api.brevo.com/v3/events', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'api-key': process.env.BREVO_API_KEY
},
body: JSON.stringify(eventData)
});
}
```
### Step 3: Automated Campaign Setup
#### Welcome Campaign for New Customers
Create an automated welcome series for new loyalty members:
```json
{
"campaign_name": "Tajo Loyalty Welcome Series",
"trigger": {
"event": "Contact Created",
"conditions": {
"LOYALTY_ID": "exists",
"SIGNUP_DATE": "today"
}
},
"emails": [
{
"delay": "immediate",
"template_id": 101,
"subject": "Welcome to Tajo Loyalty! Here's your {{params.welcome_bonus}} points bonus",
"params": {
"welcome_bonus": "500",
"loyalty_tier": "Bronze",
"next_tier_points": "1000"
}
},
{
"delay": "3 days",
"template_id": 102,
"subject": "Don't forget to use your {{params.welcome_bonus}} bonus points!"
},
{
"delay": "1 week",
"template_id": 103,
"subject": "Here's how to earn points faster with Tajo"
}
]
}
```
#### Tier Upgrade Campaign
Automatically celebrate tier upgrades:
```javascript
// Webhook handler for tier upgrades
app.post('/webhook/tier-upgrade', (req, res) => {
const { customer, previousTier, newTier } = req.body;
const campaignData = {
email: customer.email,
template_id: getTierUpgradeTemplate(newTier),
params: {
customer_name: customer.firstName,
new_tier: newTier,
previous_tier: previousTier,
new_benefits: getTierBenefits(newTier),
points_balance: customer.points
}
};
// Send congratulations email
sendBrevoEmail(campaignData);
// Add to tier-specific list
addToBrevoList(customer.email, getTierListId(newTier));
res.status(200).json({ success: true });
});
```
### Step 4: Loyalty Event Tracking
#### Key Events to Track
Set up tracking for these essential loyalty events:
```javascript
const loyaltyEvents = {
// Account Events
'Account Created': {
properties: ['signup_source', 'referral_code', 'welcome_bonus']
},
'Profile Updated': {
properties: ['updated_fields', 'marketing_consent']
},
// Purchase Events
'Purchase Completed': {
properties: ['order_total', 'points_earned', 'loyalty_tier', 'products']
},
'Product Returned': {
properties: ['return_reason', 'points_deducted', 'refund_amount']
},
// Loyalty Events
'Points Earned': {
properties: ['points_amount', 'earning_reason', 'total_balance']
},
'Points Redeemed': {
properties: ['points_used', 'reward_type', 'remaining_balance']
},
'Tier Upgraded': {
properties: ['previous_tier', 'new_tier', 'upgrade_benefits']
},
// Engagement Events
'Email Opened': {
properties: ['campaign_type', 'subject_line', 'device']
},
'Reward Browsed': {
properties: ['reward_category', 'reward_name', 'points_required']
},
'Referral Made': {
properties: ['referral_method', 'referee_email', 'referral_bonus']
}
};
```
#### Event Tracking Implementation
```javascript
class TajoBrevoEventTracker {
constructor(apiKey) {
this.apiKey = apiKey;
this.baseUrl = 'https://api.brevo.com/v3';
}
async trackEvent(customerEmail, eventName, properties = {}) {
const eventData = {
email: customerEmail,
event: eventName,
properties: {
timestamp: new Date().toISOString(),
source: 'tajo_platform',
...properties
}
};
try {
const response = await fetch(`${this.baseUrl}/events`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'api-key': this.apiKey
},
body: JSON.stringify(eventData)
});
if (!response.ok) {
throw new Error(`Event tracking failed: ${response.statusText}`);
}
return await response.json();
} catch (error) {
console.error('Brevo event tracking error:', error);
throw error;
}
}
// Convenience methods for common events
async trackPurchase(customer, order) {
return this.trackEvent(customer.email, 'Purchase Completed', {
order_id: order.id,
order_total: order.total,
currency: order.currency,
points_earned: order.pointsEarned,
loyalty_tier: customer.tier,
items_count: order.items.length,
first_purchase: customer.orderCount === 1
});
}
async trackTierUpgrade(customer, previousTier) {
return this.trackEvent(customer.email, 'Tier Upgraded', {
previous_tier: previousTier,
new_tier: customer.tier,
points_balance: customer.points,
benefits_unlocked: getTierBenefits(customer.tier),
upgrade_date: new Date().toISOString()
});
}
}
```
### Step 5: Segmentation Strategy
#### Customer Segments
Create targeted segments in Brevo for personalized campaigns:
```javascript
const loyaltySegments = [
// Tier-based segments
{
name: "Bronze Members",
conditions: { LOYALTY_TIER: "Bronze" },
campaigns: ["tier_upgrade_promotion", "engagement_boost"]
},
{
name: "Silver Members",
conditions: { LOYALTY_TIER: "Silver" },
campaigns: ["premium_offers", "early_access"]
},
{
name: "Gold Members",
conditions: { LOYALTY_TIER: "Gold" },
campaigns: ["vip_treatment", "exclusive_rewards"]
},
{
name: "Platinum Members",
conditions: { LOYALTY_TIER: "Platinum" },
campaigns: ["luxury_experiences", "personal_offers"]
},
// Behavior-based segments
{
name: "High Spenders",
conditions: { TOTAL_SPENT: ">1000" },
campaigns: ["luxury_catalog", "big_spender_rewards"]
},
{
name: "Frequent Shoppers",
conditions: { PURCHASE_FREQUENCY: "weekly" },
campaigns: ["convenience_offers", "bulk_discounts"]
},
{
name: "At-Risk Customers",
conditions: { LAST_PURCHASE: ">90 days" },
campaigns: ["win_back", "special_incentives"]
},
{
name: "Birthday Month",
conditions: { BIRTHDAY: "this_month" },
campaigns: ["birthday_specials", "bonus_points"]
}
];
```
### Step 6: Testing and Monitoring
#### Integration Testing Checklist
- [ ] **Contact Sync**: New customers appear in Brevo
- [ ] **Order Sync**: Purchases trigger events correctly
- [ ] **Event Tracking**: All loyalty events are recorded
- [ ] **Campaign Triggers**: Automated emails send properly
- [ ] **Segmentation**: Customers move between lists correctly
- [ ] **Webhook Delivery**: Real-time sync works reliably
#### Monitoring Setup
```javascript
// Health check endpoint
app.get('/integration/health', async (req, res) => {
const checks = {
brevo_api: await checkBrevoConnection(),
webhook_delivery: await checkWebhookDelivery(),
event_tracking: await checkEventTracking(),
campaign_triggers: await checkCampaignTriggers()
};
const allHealthy = Object.values(checks).every(check => check.status === 'ok');
res.status(allHealthy ? 200 : 503).json({
status: allHealthy ? 'healthy' : 'degraded',
checks,
timestamp: new Date().toISOString()
});
});
```
### Troubleshooting Common Issues
#### API Rate Limits
Brevo has rate limits - implement retry logic:
```javascript
async function makeBrevoRequest(url, options, retries = 3) {
try {
const response = await fetch(url, options);
if (response.status === 429) {
const retryAfter = response.headers.get('Retry-After') || 60;
await new Promise(resolve => setTimeout(resolve, retryAfter * 1000));
return makeBrevoRequest(url, options, retries - 1);
}
return response;
} catch (error) {
if (retries > 0) {
await new Promise(resolve => setTimeout(resolve, 5000));
return makeBrevoRequest(url, options, retries - 1);
}
throw error;
}
}
```
#### Data Sync Issues
Monitor and resolve sync conflicts:
```javascript
// Sync conflict resolution
async function resolveSyncConflict(tajoData, brevoData) {
// Use most recent timestamp as source of truth
const tajoUpdated = new Date(tajoData.updatedAt);
const brevoUpdated = new Date(brevoData.modifiedAt);
if (tajoUpdated > brevoUpdated) {
// Update Brevo with Tajo data
await updateBrevoContact(brevoData.id, tajoData);
} else {
// Update Tajo with Brevo data
await updateTajoCustomer(tajoData.id, brevoData);
}
}
```
### Next Steps
1. **[Set up Webhooks](/docs/webhook-configuration/setup-guide)** for real-time sync
2. **Create Email Templates** for loyalty campaigns
3. **Configure SMS Automation** for urgent notifications
4. **Set up Analytics** to track performance
### Support and Resources
- **Integration Support**: support@tajo.com
- **Brevo API Documentation**: [api.brevo.com](https://developers.brevo.com)
- **Sample Code Repository**: [github.com/tajo/brevo-integration](https://github.com/tajo/brevo-integration)
- **Contact Support**: [/contact](/contact)
### Frequently asked questions
**How do I sync a customer into Brevo as a contact?**
POST to https://api.brevo.com/v3/contacts with Content-Type: application/json and your key in the api-key header. The body holds the email, an attributes object such as FIRSTNAME, LASTNAME, PHONE, TOTAL_SPENT and SIGNUP_DATE, and listIds for the lists to add the contact to.
**How do I sync an order and a purchase event to Brevo?**
Two calls with the api-key header: POST /v3/ecommerce/orders with the order id, email, products with id, name, quantity, price and category, revenue and date; then POST /v3/events with the email, the event name Purchase Completed and properties such as order_id and amount.
**Which customer events are worth tracking in Brevo?**
Account events such as Account Created and Profile Updated, purchase events such as Purchase Completed and Product Returned, and engagement events such as Email Opened and Referral Made, each with properties like order_total, products or marketing_consent.
**How do I handle Brevo API rate limits in an integration?**
On a 429 response read the Retry-After header, defaulting to 60 seconds, wait that long and retry, giving up after about 3 attempts. On a network error wait 5 seconds and retry.
**Which segments should I build in Brevo from synced purchase data?**
Behavior-based segments such as high spenders with TOTAL_SPENT above 1,000, frequent shoppers by purchase frequency, at-risk customers whose LAST_PURCHASE is more than 90 days ago, and a birthday-month segment, each paired with its own campaign.
---
## Authentication Setup
Source: https://tajo.io/docs/quick-start/authentication-setup/
Set up secure authentication for Brevo API and MCP
Brevo provides two authentication methods depending on your use case: **API Key authentication** for standard API access and **MCP Token authentication** for AI integrations. This guide covers both methods.
### API Key Authentication
Brevo API keys are used for standard REST API access to all Brevo services.
#### Generate Your API Key
1. **Log in** to your Brevo dashboard
2. Navigate to **Settings** → **API Keys**
3. Click **Generate a New API Key**
4. Give your key a descriptive name (e.g., "My App Production")
5. **Copy and store** the key securely (you won't see it again!)
#### API Key Security Best Practices
##### ✅ DO
- **Store keys securely** using environment variables
- **Use different keys** for development and production
- **Rotate keys regularly** (every 90 days recommended)
- **Limit key permissions** to only what's needed
- **Monitor key usage** in your dashboard
##### ❌ DON'T
- **Never commit keys** to version control
- **Don't hardcode keys** in your application
- **Don't share keys** via email or chat
- **Don't use production keys** for testing
#### Environment Variables
Store your API keys as environment variables:
##### Linux/macOS (.bashrc or .zshrc)
```bash
export BREVO_API_KEY="your_api_key_here"
```
##### Windows (Command Prompt)
```cmd
set BREVO_API_KEY=your_api_key_here
```
##### Node.js (.env file)
```env
BREVO_API_KEY=your_api_key_here
```
```javascript
// Load from environment
const apiKey = process.env.BREVO_API_KEY;
```
##### Python
```python
import os
api_key = os.getenv('BREVO_API_KEY')
```
##### PHP
```php
$apiKey = $_ENV['BREVO_API_KEY'];
// or
$apiKey = getenv('BREVO_API_KEY');
```
#### Authentication Headers
Include your API key in the request headers:
##### Standard Header Format
```http
GET /v3/account HTTP/1.1
Host: api.brevo.com
Accept: application/json
api-key: your_api_key_here
```
##### JavaScript Example
```javascript
const headers = {
'Accept': 'application/json',
'api-key': process.env.BREVO_API_KEY
};
fetch('https://api.brevo.com/v3/account', { headers })
.then(response => response.json())
.then(data => console.log(data));
```
##### Python Requests
```python
import requests
headers = {
'Accept': 'application/json',
'api-key': os.getenv('BREVO_API_KEY')
}
response = requests.get('https://api.brevo.com/v3/account', headers=headers)
```
#### Key Permissions and Scopes
Different API keys can have different permissions:
- **Read-only**: Only GET requests allowed
- **Send emails**: Transactional email permissions
- **Manage contacts**: Create, update, delete contacts
- **Campaign management**: Create and send campaigns
- **Full access**: All API endpoints
#### Testing Your Authentication
Use this endpoint to verify your authentication works:
```bash
curl -X GET "https://api.brevo.com/v3/account" \
-H "Accept: application/json" \
-H "api-key: $BREVO_API_KEY"
```
**Success Response (200 OK):**
```json
{
"email": "your-email@company.com",
"firstName": "John",
"lastName": "Doe"
}
```
**Authentication Error (401 Unauthorized):**
```json
{
"code": "unauthorized",
"message": "Invalid API key provided"
}
```
#### Key Rotation
To rotate your API key:
1. **Generate a new key** in the dashboard
2. **Update your environment variables** with the new key
3. **Deploy your application** with the new key
4. **Test thoroughly** to ensure everything works
5. **Revoke the old key** once confident in the new one
#### Monitoring API Key Usage
Track your API key usage in the Brevo dashboard:
- **Requests per day/month**
- **Error rates by endpoint**
- **Geographic usage patterns**
- **Peak usage times**
#### Multiple API Keys Strategy
For larger applications, consider using multiple API keys:
- **Production**: Live customer data and emails
- **Staging**: Pre-production testing
- **Development**: Local development and testing
- **Monitoring**: Health checks and metrics
- **Third-party**: External integrations
---
### MCP Token Authentication
The **Brevo Model Context Protocol (MCP)** is an AI integration framework that enables AI assistants to interact with Brevo services. MCP uses a separate authentication method via MCP tokens.
#### What is MCP?
MCP provides standardized AI access to Brevo APIs through:
- **Transport**: HTTPS
- **Base URL**: `https://mcp.brevo.com/v1/`
- **Response Format**: JSON
- **Authentication**: MCP Token (different from API keys)
#### Generate Your MCP Token
1. **Log in** to your Brevo dashboard
2. Navigate to **Settings** → **MCP Tokens** (or account settings)
3. Generate a new MCP token
4. **Copy and store** the token securely
> **Note**: MCP is currently available only for early access users.
#### Using MCP Tokens
MCP tokens are used specifically for AI integrations and Model Context Protocol connections:
```bash
export BREVO_MCP_TOKEN="your_mcp_token_here"
```
Include the MCP token in requests to MCP endpoints:
```http
GET /v1/account HTTP/1.1
Host: mcp.brevo.com
Accept: application/json
Authorization: Bearer your_mcp_token_here
```
#### MCP vs API Key
| Feature | API Key | MCP Token |
|---------|---------|-----------|
| **Use Case** | Standard REST API access | AI integration & MCP connections |
| **Base URL** | api.brevo.com | mcp.brevo.com |
| **Header** | `api-key` | `Authorization: Bearer` |
| **Availability** | All users | Early access users |
#### MCP Security Best Practices
- Store MCP tokens separately from API keys
- Use environment variables for token storage
- Rotate tokens regularly
- Never commit tokens to version control
- Monitor MCP usage in your dashboard
---
### Troubleshooting Authentication
#### Common API Key Issues
**Invalid API Key Format**
- Keys should be exactly 64 characters long
- Check for extra spaces or characters
**Permissions Error**
- Verify your key has the required permissions
- Check if the key is active in your dashboard
**Rate Limiting**
- Authentication failures count toward rate limits
- Wait before retrying with correct credentials
**Geographic Restrictions**
- Some accounts have IP restrictions
- Contact support if you need to whitelist IPs
#### Common MCP Token Issues
**MCP Not Available**
- Ensure you have early access to MCP features
- Contact Brevo support to request access
**Invalid Token**
- Verify token is copied correctly without spaces
- Check token hasn't expired or been revoked
**Wrong Base URL**
- MCP tokens only work with mcp.brevo.com
- Don't use MCP tokens with api.brevo.com endpoints
### Next Steps
- [Learn about rate limits](/docs/rate-limits/)
- [Install an SDK](/docs/sdks-libraries/)
- [Make your first API call](/docs/quick-start/first-api-call/)
### Frequently asked questions
**How do I generate a Brevo API key?**
Log in to the Brevo dashboard, go to Settings, API Keys, click Generate a New API Key, give it a descriptive name such as My App Production, then copy and store it securely; it is shown only once.
**Which header do I put my Brevo API key in?**
Put it in the api-key request header, with Accept: application/json, against api.brevo.com, for example GET /v3/account. Keep the key in an environment variable such as BREVO_API_KEY and read it from there in Node.js, Python or PHP.
**What is the difference between a Brevo API key and an MCP token?**
An API key gives standard REST access at api.brevo.com through the api-key header and is available to all users. An MCP token is for AI integrations at mcp.brevo.com, sent as Authorization: Bearer, and is available to early access users. They are not interchangeable.
**How do I test that my Brevo API key works?**
Call GET https://api.brevo.com/v3/account with the api-key header. A 200 response returns your account email and name; a 401 with code unauthorized means the key is invalid.
**How do I rotate a Brevo API key safely?**
Generate a new key in the dashboard, update your environment variables, deploy, test thoroughly, then revoke the old key. Rotate about every 90 days, use separate keys for development and production, and never commit keys to version control.
**Why is my Brevo API key rejected?**
Check the format, exactly 64 characters with no extra spaces, that the key has the required permissions and is still active, and that you are within rate limits, since authentication failures count toward them. Some accounts also restrict by IP.
---
## First API Call
Source: https://tajo.io/docs/quick-start/first-api-call/
Make your first API call to the Brevo API and verify your setup
Let's make your first API call to verify your Brevo API setup is working correctly.
### Prerequisites
- A Brevo account
- An API key from your dashboard
- A tool for making HTTP requests (curl, Postman, or similar)
### Get Account Information
The simplest first call is to get your account information:
#### Using cURL
```bash
curl -X GET "https://api.brevo.com/v3/account" \
-H "Accept: application/json" \
-H "api-key: YOUR_API_KEY"
```
#### Using JavaScript (Node.js)
```javascript
const fetch = require('node-fetch');
const getAccount = async () => {
try {
const response = await fetch('https://api.brevo.com/v3/account', {
method: 'GET',
headers: {
'Accept': 'application/json',
'api-key': 'YOUR_API_KEY'
}
});
const data = await response.json();
console.log('Account Info:', data);
} catch (error) {
console.error('Error:', error);
}
};
getAccount();
```
#### Using Python
```python
import requests
url = "https://api.brevo.com/v3/account"
headers = {
"Accept": "application/json",
"api-key": "YOUR_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.json())
```
#### Using PHP
```php
```
### Expected Response
If successful, you'll receive a response like this:
```json
{
"email": "your-email@company.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Your Company",
"address": {
"street": "123 Main Street",
"city": "New York",
"zipCode": "10001",
"country": "United States"
},
"plan": [
{
"type": "payAsYouGo",
"credits": 10000,
"creditsUsed": 1500
}
]
}
```
### Error Handling
If you encounter errors, check these common issues:
#### Invalid API Key (401 Unauthorized)
```json
{
"code": "unauthorized",
"message": "Invalid API key provided"
}
```
**Solution**: Verify your API key is correct and has the proper permissions.
#### Rate Limit Exceeded (429 Too Many Requests)
```json
{
"code": "too_many_requests",
"message": "Rate limit exceeded"
}
```
**Solution**: Wait before making another request or upgrade your plan.
#### Server Error (500 Internal Server Error)
```json
{
"code": "internal_error",
"message": "An internal error occurred"
}
```
**Solution**: Check our [status page](https://status.brevo.com) or contact support.
### Next Steps
Now that you've made your first successful API call:
1. [Set up authentication](/docs/authentication/) properly
2. [Install an SDK](/docs/sdks-libraries/) for your language
3. [Learn about rate limits](/docs/rate-limits/)
4. [Explore email endpoints](/docs/email-messaging/)
### Frequently asked questions
**What is the simplest first call to the Brevo API?**
GET https://api.brevo.com/v3/account with the headers Accept: application/json and api-key: YOUR_API_KEY. The response returns your account email, name, company, address and plan details including credits and credits used.
**How do I call the Brevo API from Python?**
Use requests.get on https://api.brevo.com/v3/account with a headers dict containing Accept: application/json and api-key set to your key, then print response.json().
**Why does my first Brevo API call return 401 Unauthorized?**
The API key is invalid: the response carries code unauthorized and the message Invalid API key provided. Verify the key is correct and has the proper permissions.
**What does a 429 error from the Brevo API mean?**
Rate limit exceeded, returned with code too_many_requests. Wait before making another request or upgrade your plan. A 500 internal_error means a server problem; check status.brevo.com or contact support.
---
## Quick Start Guide
Source: https://tajo.io/docs/quick-start/
Get started with the Brevo API in minutes
Welcome to the Brevo API! This guide will help you make your first API call and understand the basics.
### Prerequisites
Before you begin, you'll need:
- A Brevo account
- An API key from your Brevo dashboard
- Basic understanding of REST APIs
### Your First API Call
Here's a simple example to get your account information:
```bash
curl -X GET "https://api.brevo.com/v3/account" \
-H "Accept: application/json" \
-H "api-key: YOUR_API_KEY"
```
### Next Steps
- [Set up authentication](/docs/authentication/)
- [Explore our SDKs](/docs/sdks-libraries/)
- [Learn about rate limits](/docs/rate-limits/)
### Frequently asked questions
**What do I need to start using the Brevo API?**
A Brevo account, an API key from your Brevo dashboard, and a basic understanding of REST APIs.
**How do I make my first Brevo API call?**
Send a GET request to https://api.brevo.com/v3/account with an Accept: application/json header and your key in the api-key header. The response returns your account information.
**Where do I go after my first Brevo API call?**
Set up authentication, explore the official SDKs, and read about rate limits.
---
## Overview
Source: https://tajo.io/docs/quick-start/overview/
Welcome to the Brevo API - your gateway to powerful email and SMS automation
Welcome to the Brevo API documentation! This comprehensive guide will help you integrate with Brevo's powerful email marketing, transactional email, and SMS services.
### What is Brevo?
Brevo is a complete digital marketing platform that helps businesses grow through email marketing, transactional emails, SMS campaigns, chat, CRM, and marketing automation.
### API Capabilities
Our API provides access to:
- **Email Marketing**: Create and send marketing campaigns
- **Transactional Email**: Send automated emails triggered by user actions
- **SMS Marketing**: Reach customers via SMS campaigns and notifications
- **Contact Management**: Manage your contact lists and segments
- **Marketing Automation**: Build complex workflows and funnels
- **Analytics**: Track performance and engagement metrics
### Getting Started Checklist
1. **Create a Brevo account** at [brevo.com](https://brevo.com)
2. **Generate an API key** from your dashboard
3. **Make your first API call** to verify authentication
4. **Install an SDK** for your preferred programming language
5. **Explore the documentation** to understand available endpoints
### Base URL
All API requests should be made to:
```
https://api.brevo.com/v3/
```
### Authentication
The Brevo API uses API keys for authentication. Include your API key in the header:
```bash
Authorization: api-key YOUR_API_KEY
```
### Rate Limits
- **Free accounts**: 300 requests per day
- **Starter plans**: 20,000 requests per day
- **Business plans**: 50,000 requests per day
- **Enterprise plans**: Custom limits
### Support
Need help? Contact our support team:
- **Email**: api-support@brevo.com
- **Documentation**: [help.brevo.com](https://help.brevo.com)
- **Status Page**: [status.brevo.com](https://status.brevo.com)
### Frequently asked questions
**What is Brevo?**
Brevo is a digital marketing platform for email marketing, transactional email, SMS campaigns, chat, CRM and marketing automation. Its API covers email marketing, transactional email, SMS, contact management, marketing automation and analytics.
**What is the base URL of the Brevo API?**
https://api.brevo.com/v3/. Authenticate by sending your API key in a header on every request.
**How do I get started with the Brevo API?**
Five steps: create a Brevo account at brevo.com, generate an API key from your dashboard, make a first API call to verify authentication, install an SDK for your language, and explore the documentation for the available endpoints.
**Where do I get support for the Brevo API?**
Email api-support@brevo.com, read help.brevo.com, or check status.brevo.com for service status.
---
## Global Limits
Source: https://tajo.io/docs/rate-limits/global-limits/
Brevo's three API rate limit tiers, the limits on each, and how to handle a 429
Brevo limits API requests per endpoint. Each limit is a number of requests per second (RPS), per hour (RPH), or both. The figures below come from Brevo's [rate limits page](https://developers.brevo.com/docs/api-limits), checked on 7 October 2026. Check that page before you size a large job.
### Rate Limit Tiers
| Tier | Available on |
|------|--------------|
| **General** | Free, Starter, Standard, Professional and Enterprise |
| **Advanced** | Professional and Enterprise |
| **Extended** | Enterprise |
### Limits by Tier
| Endpoint | General | Advanced | Extended |
|----------|---------|----------|----------|
| `POST /v3/smtp/email`, `GET /v3/smtp/blockedContacts` | 1,000 RPS, 3,600,000 RPH | 2,000 RPS, 7,200,000 RPH | 6,000 RPS |
| `GET /v3/smtp/emails` | 2 RPS, 7,200 RPH | 3 RPS, 10,800 RPH | 18,000 RPH |
| `POST /v3/transactionalSMS/send` | 150 RPS, 540,000 RPH | 200 RPS, 720,000 RPH | 250 RPS |
| `POST /v3/events` | 10 RPS, 36,000 RPH | 20 RPS, 72,000 RPH | 60 RPS |
| `POST /v3/orders/status` | 5 RPS, 18,000 RPH | 10 RPS, 36,000 RPH | 15 RPS |
| `POST /v3/products` | 2 RPS, 7,200 RPH | 4 RPS, 14,400 RPH | 21,600 RPH |
| Other endpoints under `/v3/smtp` | 300 RPH | 600 RPH | 1,800 RPH |
| All endpoints under `/v3/contacts` | 10 RPS, 36,000 RPH | 20 RPS, 72,000 RPH | 60 RPS |
| All endpoints under `/v3/loyalty` | 600 RPH | 1,200 RPH | 100,000 RPH |
| All other endpoints | 100 RPH | 200 RPH | 600 RPH |
When an endpoint has both an RPS and an RPH limit, stay under both.
### Rate Limit Headers
Rate-limited endpoints return these headers:
```http
HTTP/1.1 200 OK
x-sib-ratelimit-limit: 1000
x-sib-ratelimit-remaining: 750
x-sib-ratelimit-reset: 1
```
#### Header Descriptions
- `x-sib-ratelimit-limit`: requests allowed in the current window
- `x-sib-ratelimit-remaining`: requests left in the current window
- `x-sib-ratelimit-reset`: time until the window resets, usually in seconds
Brevo documents these headers on its [rate limit headers page](https://developers.brevo.com/docs/limit-headers).
### Monitoring Usage
#### Check Current Usage
```javascript
const checkRateLimit = async () => {
const response = await fetch('https://api.brevo.com/v3/account', {
headers: { 'api-key': process.env.BREVO_API_KEY }
});
console.log({
limit: response.headers.get('x-sib-ratelimit-limit'),
remaining: response.headers.get('x-sib-ratelimit-remaining'),
resetInSeconds: Number(response.headers.get('x-sib-ratelimit-reset'))
});
};
```
### Handling Rate Limits
#### Exponential Backoff
```javascript
const makeRequestWithBackoff = async (url, options, maxRetries = 3) => {
for (let i = 0; i < maxRetries; i++) {
const response = await fetch(url, options);
if (response.status !== 429) return response;
const resetSeconds = Number(response.headers.get('x-sib-ratelimit-reset') || 1);
const delay = Math.max(resetSeconds * 1000, 1000 * Math.pow(2, i));
console.log(`Rate limited. Waiting ${delay}ms before retry ${i + 1}`);
await new Promise(resolve => setTimeout(resolve, delay));
}
throw new Error('Rate limit retries exhausted');
};
```
### When You Keep Hitting Limits
1. **Spread requests evenly**: a 1,000 RPS limit allows up to 60,000 requests a minute only when they are spread evenly.
2. **Batch and cache**: use bulk endpoints and avoid re-reading data you already have.
3. **Use webhooks for statistics**: receive events instead of polling statistics endpoints.
4. **Consider a higher tier**: the advanced and extended tiers come with Professional and Enterprise plans.
### Frequently asked questions
**How do I track my API usage against the Brevo rate limit headers?**
Read x-sib-ratelimit-limit for the requests allowed in the current window, x-sib-ratelimit-remaining for what is left, and x-sib-ratelimit-reset for the time until the window resets, usually in seconds.
**Which Brevo rate limit tier does my plan get?**
The general tier is available on every plan. The advanced tier is available on Professional and Enterprise. The extended tier is available on Enterprise only.
**How should I handle a 429 from the Brevo API?**
Wait for the time in x-sib-ratelimit-reset, then retry with exponential backoff and give up after a few attempts. If you hit limits consistently, spread requests evenly, batch, cache, use webhooks instead of polling, or move to a plan with a higher tier.
---
## Rate Limits
Source: https://tajo.io/docs/rate-limits/
Understanding Brevo API rate limits and best practices
The Brevo API limits requests per endpoint, not per day. Each limit is a number of requests per second (RPS), per hour (RPH), or both, and when both apply you must stay under both. Exceeding a limit returns `429 Too Many Requests`.
### Limits on the general tier
The general tier applies to every Brevo plan: Free, Starter, Standard, Professional and Enterprise. These are the limits Brevo publishes for it:
| Endpoint | Limit |
|----------|-------|
| `POST /v3/smtp/email`, `GET /v3/smtp/blockedContacts` | 1,000 RPS, 3,600,000 RPH |
| `POST /v3/transactionalSMS/send` | 150 RPS, 540,000 RPH |
| All endpoints under `/v3/contacts` | 10 RPS, 36,000 RPH |
| `POST /v3/events` | 10 RPS, 36,000 RPH |
| `POST /v3/orders/status` | 5 RPS, 18,000 RPH |
| `POST /v3/products` | 2 RPS, 7,200 RPH |
| `GET /v3/smtp/emails` | 2 RPS, 7,200 RPH |
| Other endpoints under `/v3/smtp` | 300 RPH |
| All endpoints under `/v3/loyalty` | 600 RPH |
| All other endpoints | 100 RPH |
Professional and Enterprise accounts can use the advanced tier, which doubles most of these limits. Enterprise accounts can use the extended tier, the highest. See [Global limits](/docs/rate-limits/global-limits/) for the three tiers side by side, and Brevo's [rate limits page](https://developers.brevo.com/docs/api-limits) for the current figures.
### Rate Limit Headers
Rate-limited endpoints return three headers:
```
x-sib-ratelimit-limit: 1000
x-sib-ratelimit-remaining: 750
x-sib-ratelimit-reset: 1
```
- `x-sib-ratelimit-limit`: requests allowed in the current window
- `x-sib-ratelimit-remaining`: requests left in the current window
- `x-sib-ratelimit-reset`: time until the window resets, usually in seconds
### Best Practices
- Monitor rate limit headers
- Implement exponential backoff for retries
- Spread requests evenly across the window
- Cache responses when possible
- Use webhooks instead of polling
### Frequently asked questions
**How do I know how many Brevo API requests I have left?**
Rate-limited endpoints return three headers: x-sib-ratelimit-limit, x-sib-ratelimit-remaining and x-sib-ratelimit-reset, the last being the time until the window resets, usually in seconds.
**What are the Brevo API rate limits?**
Limits are per endpoint, in requests per second, per hour, or both. On the general tier, which every plan gets, POST /v3/smtp/email allows 1,000 requests per second, the contacts endpoints 10 per second and 36,000 per hour, and endpoints without their own limit 100 per hour. Exceeding a limit returns 429.
**How do I stay within Brevo API rate limits?**
Monitor the rate limit headers, retry with exponential backoff, spread requests evenly across the window, cache responses when possible, and use webhooks instead of polling.
---
## Companies Management
Source: https://tajo.io/docs/sales-crm/companies/
Manage B2B companies and corporate accounts in Brevo CRM for Tajo enterprise loyalty programs
The Brevo CRM Companies API enables you to manage B2B relationships and corporate accounts for enterprise loyalty programs within the Tajo platform.
### Overview
Company management is essential for:
- **Corporate loyalty programs** with bulk rewards and tier management
- **B2B customer relationships** with dedicated account managers
- **Enterprise sales tracking** with company-level analytics
- **Multi-location businesses** with centralized loyalty management
- **Partner and reseller programs** with special pricing and rewards
### Quick Start
#### Create Company
```http
POST https://api.brevo.com/v3/companies
Content-Type: application/json
api-key: YOUR_API_KEY
{
"name": "Acme Corporation",
"attributes": {
"industry": "Technology",
"company_size": "500-1000",
"website": "https://acmecorp.com",
"phone": "+1-555-0123",
"address": "123 Business Ave, Tech City, CA 90210",
"loyalty_program": "Enterprise Plus",
"loyalty_tier": "Corporate Gold",
"annual_spend": 250000,
"contract_value": 500000,
"renewal_date": "2024-12-31",
"account_manager": "Sarah Johnson",
"industry_vertical": "Software Services"
}
}
```
#### Response
```json
{
"id": "comp_123456789",
"name": "Acme Corporation",
"created_at": "2024-01-25T14:30:00Z",
"updated_at": "2024-01-25T14:30:00Z"
}
```
### Enterprise Loyalty Integration
#### Corporate Account Setup
Set up comprehensive corporate accounts with loyalty program integration:
```javascript
class TajoEnterpriseService {
constructor() {
this.companiesApi = new CompaniesApi();
this.contactsApi = new ContactsApi();
}
async createCorporateAccount(companyData) {
// Create company with loyalty attributes
const company = {
name: companyData.name,
attributes: {
// Business Information
industry: companyData.industry,
company_size: companyData.employeeCount,
website: companyData.website,
phone: companyData.phone,
address: companyData.address,
tax_id: companyData.taxId,
// Loyalty Program Data
loyalty_program: 'Enterprise Plus',
loyalty_tier: this.determineEnterpriseTier(companyData.annualSpend),
loyalty_points: 0,
annual_spend: companyData.annualSpend || 0,
lifetime_value: companyData.lifetimeValue || 0,
// Contract Information
contract_value: companyData.contractValue,
contract_start: companyData.contractStart,
renewal_date: companyData.renewalDate,
payment_terms: companyData.paymentTerms,
// Account Management
account_manager: companyData.accountManager,
success_manager: companyData.successManager,
billing_contact: companyData.billingContact,
// Preferences
bulk_discount_eligible: true,
volume_rewards_enabled: true,
consolidated_billing: companyData.consolidatedBilling,
multi_location: companyData.hasMultipleLocations
}
};
try {
const response = await this.companiesApi.createCompany(company);
// Set up corporate loyalty tracking
await this.initializeCorporateLoyalty(response.id, companyData);
return response;
} catch (error) {
console.error('Error creating corporate account:', error);
throw error;
}
}
determineEnterpriseTier(annualSpend) {
if (annualSpend >= 1000000) return 'Enterprise Diamond';
if (annualSpend >= 500000) return 'Enterprise Platinum';
if (annualSpend >= 250000) return 'Enterprise Gold';
if (annualSpend >= 100000) return 'Enterprise Silver';
return 'Enterprise Bronze';
}
async initializeCorporateLoyalty(companyId, companyData) {
// Create corporate loyalty program entry
await loyaltyService.createCorporateProgram({
companyId: companyId,
programType: 'enterprise',
tier: this.determineEnterpriseTier(companyData.annualSpend),
volumeDiscounts: this.calculateVolumeDiscounts(companyData.annualSpend),
bulkRewards: true,
dedicatedSupport: true
});
// Set up automated tracking
await loyaltyService.setupCorporateTracking(companyId, {
trackVolumeDiscounts: true,
trackBulkOrders: true,
trackMultiLocation: companyData.hasMultipleLocations,
consolidateReporting: true
});
}
}
```
#### Corporate Tier Management
Implement sophisticated tier management for B2B accounts:
```javascript
class CorporateTierManager {
constructor() {
this.tierThresholds = {
'Enterprise Bronze': { minSpend: 0, benefits: ['basic_support', 'standard_shipping'] },
'Enterprise Silver': { minSpend: 100000, benefits: ['priority_support', 'free_shipping', '5%_discount'] },
'Enterprise Gold': { minSpend: 250000, benefits: ['dedicated_manager', 'expedited_shipping', '10%_discount'] },
'Enterprise Platinum': { minSpend: 500000, benefits: ['premium_support', 'custom_integration', '15%_discount'] },
'Enterprise Diamond': { minSpend: 1000000, benefits: ['white_glove_service', 'unlimited_integration', '20%_discount'] }
};
}
async evaluateTierUpgrade(companyId, currentSpend) {
const company = await this.companiesApi.getCompany(companyId);
const currentTier = company.attributes.loyalty_tier;
const newTier = this.calculateTier(currentSpend);
if (newTier !== currentTier && this.isUpgrade(currentTier, newTier)) {
await this.processTierUpgrade(companyId, currentTier, newTier, currentSpend);
}
return newTier;
}
async processTierUpgrade(companyId, oldTier, newTier, currentSpend) {
// Update company tier
await this.companiesApi.updateCompany(companyId, {
attributes: {
loyalty_tier: newTier,
tier_upgrade_date: new Date().toISOString(),
previous_tier: oldTier,
annual_spend: currentSpend
}
});
// Notify account team
const company = await this.companiesApi.getCompany(companyId);
await this.notifyAccountTeam(company, {
upgradeType: 'tier_upgrade',
oldTier: oldTier,
newTier: newTier,
newBenefits: this.tierThresholds[newTier].benefits
});
// Send congratulations to company contacts
await this.sendTierUpgradeNotifications(companyId, {
companyName: company.name,
newTier: newTier,
benefits: this.tierThresholds[newTier].benefits
});
// Apply new tier benefits
await this.applyTierBenefits(companyId, newTier);
}
calculateTier(annualSpend) {
const tiers = Object.entries(this.tierThresholds)
.sort(([,a], [,b]) => b.minSpend - a.minSpend);
for (const [tier, threshold] of tiers) {
if (annualSpend >= threshold.minSpend) {
return tier;
}
}
return 'Enterprise Bronze';
}
}
```
### Multi-Location Management
#### Location Hierarchy
Manage complex multi-location corporate structures:
```javascript
class MultiLocationManager {
async createLocationHierarchy(parentCompanyId, locations) {
const locationCompanies = [];
for (const location of locations) {
const locationCompany = {
name: `${location.companyName} - ${location.locationName}`,
attributes: {
parent_company_id: parentCompanyId,
location_type: location.type, // 'headquarters', 'branch', 'franchise'
location_name: location.locationName,
address: location.address,
phone: location.phone,
manager: location.manager,
employee_count: location.employeeCount,
// Loyalty Program Inheritance
loyalty_program: 'Enterprise Plus',
inherit_parent_tier: true,
location_budget: location.budget,
location_spending_limit: location.spendingLimit,
// Performance Tracking
location_performance_target: location.target,
location_rewards_pool: location.rewardsPool
}
};
const createdLocation = await this.companiesApi.createCompany(locationCompany);
locationCompanies.push(createdLocation);
// Link employees to location
await this.linkEmployeesToLocation(createdLocation.id, location.employees);
}
// Set up consolidated reporting
await this.setupConsolidatedReporting(parentCompanyId, locationCompanies);
return locationCompanies;
}
async linkEmployeesToLocation(locationCompanyId, employees) {
for (const employee of employees) {
await this.contactsApi.updateContact(employee.email, {
attributes: {
company_id: locationCompanyId,
employee_level: employee.level,
department: employee.department,
location_rewards_eligible: true
}
});
}
}
async consolidateLocationSpending(parentCompanyId) {
const locations = await this.getCompanyLocations(parentCompanyId);
let totalSpending = 0;
let totalRewards = 0;
for (const location of locations) {
const locationSpend = location.attributes.annual_spend || 0;
const locationRewards = location.attributes.loyalty_points || 0;
totalSpending += locationSpend;
totalRewards += locationRewards;
}
// Update parent company totals
await this.companiesApi.updateCompany(parentCompanyId, {
attributes: {
consolidated_annual_spend: totalSpending,
consolidated_loyalty_points: totalRewards,
last_consolidation_date: new Date().toISOString()
}
});
// Check for corporate tier upgrades based on consolidated spending
await this.tierManager.evaluateTierUpgrade(parentCompanyId, totalSpending);
return {
totalSpending,
totalRewards,
locationCount: locations.length
};
}
}
```
### Corporate Deals and Contracts
#### Deal Management
Track and manage corporate deals with loyalty implications:
```javascript
class CorporateDealManager {
async createCorporateDeal(dealData) {
const deal = {
name: dealData.dealName,
company_id: dealData.companyId,
attributes: {
deal_value: dealData.value,
deal_stage: dealData.stage,
close_date: dealData.expectedCloseDate,
probability: dealData.probability,
deal_type: dealData.type, // 'new_business', 'renewal', 'upsell', 'expansion'
// Loyalty Program Impact
loyalty_points_included: dealData.loyaltyPointsBonus,
tier_upgrade_eligible: dealData.tierUpgradeEligible,
volume_discount_rate: dealData.volumeDiscountRate,
// Contract Terms
contract_length: dealData.contractLength,
renewal_terms: dealData.renewalTerms,
early_termination_clause: dealData.earlyTermination,
// Team Assignment
sales_rep: dealData.salesRep,
solution_engineer: dealData.solutionEngineer,
success_manager: dealData.successManager
}
};
const createdDeal = await this.dealsApi.createDeal(deal);
// Set up deal-specific loyalty tracking
if (dealData.loyaltyPointsBonus > 0) {
await this.setupDealLoyaltyTracking(createdDeal.id, dealData);
}
return createdDeal;
}
async setupDealLoyaltyTracking(dealId, dealData) {
// Create loyalty milestone based on deal closure
await loyaltyService.createMilestone({
companyId: dealData.companyId,
dealId: dealId,
type: 'deal_closure',
pointsReward: dealData.loyaltyPointsBonus,
tierBonus: dealData.tierUpgradeEligible,
triggerCondition: 'deal_won'
});
// Set up volume discount tracking
if (dealData.volumeDiscountRate > 0) {
await loyaltyService.setupVolumeTracking({
companyId: dealData.companyId,
dealId: dealId,
discountRate: dealData.volumeDiscountRate,
thresholds: this.calculateVolumeThresholds(dealData.value)
});
}
}
async processDealClosure(dealId, status) {
const deal = await this.dealsApi.getDeal(dealId);
if (status === 'won') {
// Award loyalty points for successful deal
if (deal.attributes.loyalty_points_included > 0) {
await loyaltyService.awardCorporatePoints(
deal.company_id,
deal.attributes.loyalty_points_included,
{
reason: 'Deal closure bonus',
dealId: dealId,
dealValue: deal.attributes.deal_value
}
);
}
// Trigger tier evaluation
if (deal.attributes.tier_upgrade_eligible) {
const company = await this.companiesApi.getCompany(deal.company_id);
const newSpendTotal = (company.attributes.annual_spend || 0) + deal.attributes.deal_value;
await this.tierManager.evaluateTierUpgrade(deal.company_id, newSpendTotal);
}
// Set up renewal tracking
await this.setupRenewalTracking(deal);
}
// Update deal status
await this.dealsApi.updateDeal(dealId, {
attributes: {
deal_stage: status,
close_date: new Date().toISOString(),
actual_value: deal.attributes.deal_value
}
});
}
}
```
### Corporate Analytics and Reporting
#### Enterprise Dashboard
Create comprehensive analytics for corporate accounts:
```javascript
class CorporateAnalytics {
async generateCorporateReport(companyId, timeframe) {
const company = await this.companiesApi.getCompany(companyId);
const locations = await this.getCompanyLocations(companyId);
const deals = await this.getCompanyDeals(companyId, timeframe);
const contacts = await this.getCompanyContacts(companyId);
const report = {
company: {
name: company.name,
tier: company.attributes.loyalty_tier,
totalSpending: company.attributes.annual_spend,
totalPoints: company.attributes.loyalty_points,
locations: locations.length
},
performance: {
spendingGrowth: await this.calculateSpendingGrowth(companyId, timeframe),
tierProgress: await this.calculateTierProgress(companyId),
loyaltyEngagement: await this.calculateLoyaltyEngagement(companyId),
volumeDiscountsSaved: await this.calculateVolumeDiscounts(companyId, timeframe)
},
deals: {
totalDeals: deals.length,
totalValue: deals.reduce((sum, deal) => sum + (deal.attributes.deal_value || 0), 0),
averageDealSize: deals.length > 0 ? deals.reduce((sum, deal) => sum + (deal.attributes.deal_value || 0), 0) / deals.length : 0,
winRate: deals.filter(d => d.attributes.deal_stage === 'won').length / deals.length * 100
},
engagement: {
activeContacts: contacts.filter(c => c.attributes.last_activity > this.getDateDaysAgo(30)).length,
totalContacts: contacts.length,
emailEngagement: await this.calculateEmailEngagement(contacts),
rewardRedemptions: await this.getRewardRedemptions(companyId, timeframe)
},
recommendations: await this.generateRecommendations(companyId, {
spending: company.attributes.annual_spend,
tier: company.attributes.loyalty_tier,
engagement: await this.calculateLoyaltyEngagement(companyId)
})
};
return report;
}
async generateRecommendations(companyId, metrics) {
const recommendations = [];
const company = await this.companiesApi.getCompany(companyId);
// Tier upgrade opportunities
const nextTier = this.getNextTier(metrics.tier);
if (nextTier) {
const spendingNeeded = this.getSpendingForTier(nextTier) - metrics.spending;
if (spendingNeeded > 0 && spendingNeeded < metrics.spending * 0.5) {
recommendations.push({
type: 'tier_upgrade_opportunity',
title: `${nextTier} tier within reach`,
description: `Increase annual spending by $${spendingNeeded.toLocaleString()} to unlock ${nextTier} benefits`,
priority: 'high',
potentialValue: this.calculateTierUpgradeValue(nextTier)
});
}
}
// Volume discount opportunities
if (metrics.spending > 100000 && !company.attributes.volume_discount_enrolled) {
recommendations.push({
type: 'volume_discount',
title: 'Volume discount eligible',
description: 'Enroll in volume discount program to save up to 15% on bulk orders',
priority: 'medium',
potentialSavings: metrics.spending * 0.15
});
}
// Engagement improvement
if (metrics.engagement < 0.5) {
recommendations.push({
type: 'engagement_improvement',
title: 'Boost employee engagement',
description: 'Consider employee loyalty workshops or gamification features',
priority: 'medium',
expectedImpact: 'Increase program utilization by 30%'
});
}
return recommendations;
}
}
```
### API Methods Reference
#### Companies CRUD Operations
```javascript
// Get company details
const company = await companiesApi.getCompany('comp_123456789');
// Update company attributes
await companiesApi.updateCompany('comp_123456789', {
attributes: {
annual_spend: 750000,
loyalty_tier: 'Enterprise Platinum',
last_tier_review: new Date().toISOString()
}
});
// Delete company (removes all associated data)
await companiesApi.deleteCompany('comp_123456789');
// Get all companies with filtering
const companies = await companiesApi.getCompanies({
filters: {
'attributes.loyalty_tier': 'Enterprise Gold',
'attributes.annual_spend': '>500000'
},
sort: 'attributes.annual_spend:desc',
limit: 50
});
```
#### Advanced Queries
```javascript
// Find companies by industry and tier
const techGoldCompanies = await companiesApi.getCompanies({
filters: {
'attributes.industry': 'Technology',
'attributes.loyalty_tier': 'Enterprise Gold',
'attributes.contract_value': '>250000'
}
});
// Get companies due for renewal
const renewalDueCompanies = await companiesApi.getCompanies({
filters: {
'attributes.renewal_date': `<${new Date(Date.now() + 90 * 24 * 60 * 60 * 1000).toISOString()}`
}
});
// Find high-value inactive companies
const inactiveHighValueCompanies = await companiesApi.getCompanies({
filters: {
'attributes.annual_spend': '>500000',
'attributes.last_activity': `<${new Date(Date.now() - 60 * 24 * 60 * 60 * 1000).toISOString()}`
}
});
```
### Best Practices
1. **Hierarchical Structure**: Use parent-child relationships for multi-location companies
2. **Consolidated Reporting**: Aggregate spending and rewards across all locations
3. **Tier Management**: Regular tier evaluations based on consolidated spending
4. **Account Team Integration**: Keep account managers informed of loyalty program changes
5. **Custom Attributes**: Use comprehensive attributes for industry-specific data
6. **Automated Workflows**: Set up triggers for tier upgrades and contract renewals
### Error Handling
```javascript
try {
const company = await companiesApi.createCompany(companyData);
console.log('Company created:', company.id);
} catch (error) {
if (error.status === 409) {
console.error('Company already exists with this name');
} else if (error.status === 400) {
console.error('Invalid company data:', error.message);
} else {
console.error('Unexpected error:', error);
}
}
```
### Next Steps
- **[Deal Management](/docs/sales-crm/deals)** - Track corporate deals and opportunities
- **[Task Management](/docs/sales-crm/tasks)** - Manage account activities and follow-ups
- **[Notes and Files](/docs/sales-crm/notes)** - Document customer interactions
- **CRM Analytics** - Advanced reporting and insights
### Frequently asked questions
**How do I create a company in Brevo CRM through the API?**
POST to https://api.brevo.com/v3/companies with your api-key header and a body with the company name and an attributes object such as industry, company_size, website, phone, address, annual_spend, contract_value, renewal_date and account_manager. The response returns the company id.
**How do I update or query companies in Brevo CRM?**
PATCH /v3/companies/{id} with the changed attributes, and GET /v3/companies with filters on attributes such as filters on industry or annual_spend above a value, a sort such as attributes.annual_spend:desc, and a limit.
**How do I model a company with several locations in Brevo CRM?**
Create one company per location with a parent_company_id attribute pointing at the headquarters record, plus location_type, location_name, address and manager, then aggregate spending across the locations onto the parent.
**How do I find companies whose contract renews soon?**
Query companies with a filter on attributes.renewal_date earlier than a date, for example 90 days from now, then create renewal tasks for the account manager.
**What is the Brevo CRM Companies API used for?**
Managing B2B relationships and corporate accounts: company records with attributes such as industry, size, annual spend, contract value, renewal date and account manager, linked to contacts and deals, including multi-location businesses with a parent company.
---
## Deals Management
Source: https://tajo.io/docs/sales-crm/deals/
Manage sales deals and pipeline opportunities in Brevo CRM for Tajo e-commerce revenue tracking
The Brevo CRM Deals API enables you to manage your sales pipeline, track deal progress, and automate revenue-related workflows within the Tajo platform.
### Overview
Deal management is essential for:
- **Sales pipeline tracking** with stage-based progression and forecasting
- **Revenue attribution** linking deals to e-commerce customer activity
- **Automated follow-ups** triggered by deal stage changes
- **Team performance analytics** with win/loss tracking and conversion rates
- **Loyalty program integration** awarding points on deal closure
### Quick Start
#### Create Deal
```http
POST https://api.brevo.com/v3/crm/deals
Content-Type: application/json
api-key: YOUR_API_KEY
{
"name": "Acme Corp - Enterprise Loyalty Package",
"attributes": {
"deal_stage": "Qualified",
"amount": 75000,
"close_date": "2026-06-30",
"pipeline": "Enterprise Sales",
"deal_owner": "sarah.johnson@tajo.io",
"deal_type": "new_business",
"probability": 60,
"company_id": "comp_123456789",
"contact_id": "contact_987654321",
"source": "inbound_lead",
"loyalty_points_bonus": 5000,
"contract_length_months": 12
}
}
```
#### Response
```json
{
"id": "deal_abc123def456",
"name": "Acme Corp - Enterprise Loyalty Package",
"created_at": "2026-01-25T14:30:00Z",
"updated_at": "2026-01-25T14:30:00Z"
}
```
### Get Deals
#### List All Deals
Retrieve deals with filtering and pagination:
```http
GET https://api.brevo.com/v3/crm/deals?limit=50&offset=0&sort=desc
Content-Type: application/json
api-key: YOUR_API_KEY
```
#### Response
```json
{
"items": [
{
"id": "deal_abc123def456",
"name": "Acme Corp - Enterprise Loyalty Package",
"attributes": {
"deal_stage": "Qualified",
"amount": 75000,
"close_date": "2026-06-30",
"pipeline": "Enterprise Sales",
"deal_owner": "sarah.johnson@tajo.io"
},
"created_at": "2026-01-25T14:30:00Z",
"updated_at": "2026-01-25T14:30:00Z"
}
],
"total": 1
}
```
#### Filter Deals by Stage
```http
GET https://api.brevo.com/v3/crm/deals?filters[attributes.deal_stage]=Negotiation&sort=attributes.amount:desc
```
#### Get Single Deal
```http
GET https://api.brevo.com/v3/crm/deals/{deal_id}
Content-Type: application/json
api-key: YOUR_API_KEY
```
### Update Deal
#### Update Deal Attributes
```http
PATCH https://api.brevo.com/v3/crm/deals/{deal_id}
Content-Type: application/json
api-key: YOUR_API_KEY
{
"attributes": {
"deal_stage": "Negotiation",
"amount": 82000,
"probability": 75,
"next_activity_date": "2026-02-15"
}
}
```
#### Response
```json
{
"id": "deal_abc123def456",
"updated_at": "2026-02-01T10:15:00Z"
}
```
### Deal Pipeline Management
#### Pipeline Stage Configuration
Implement structured deal progression for e-commerce sales:
```javascript
class TajoDealPipeline {
constructor() {
this.dealsApi = new DealsApi();
this.stages = [
{ name: 'Lead', probability: 10, actions: ['qualify_lead'] },
{ name: 'Qualified', probability: 25, actions: ['schedule_demo'] },
{ name: 'Demo', probability: 40, actions: ['send_proposal'] },
{ name: 'Proposal', probability: 60, actions: ['negotiate_terms'] },
{ name: 'Negotiation', probability: 80, actions: ['finalize_contract'] },
{ name: 'Closed Won', probability: 100, actions: ['onboard_customer', 'award_loyalty_points'] },
{ name: 'Closed Lost', probability: 0, actions: ['analyze_loss', 'schedule_followup'] }
];
}
async advanceDealStage(dealId, newStage) {
const deal = await this.dealsApi.getDeal(dealId);
const stageConfig = this.stages.find(s => s.name === newStage);
if (!stageConfig) {
throw new Error(`Invalid stage: ${newStage}`);
}
// Update deal with new stage
await this.dealsApi.updateDeal(dealId, {
attributes: {
deal_stage: newStage,
probability: stageConfig.probability,
stage_changed_at: new Date().toISOString(),
previous_stage: deal.attributes.deal_stage
}
});
// Execute stage-specific actions
for (const action of stageConfig.actions) {
await this.executeStageAction(dealId, action, deal);
}
return { dealId, newStage, probability: stageConfig.probability };
}
async executeStageAction(dealId, action, deal) {
switch (action) {
case 'award_loyalty_points':
if (deal.attributes.loyalty_points_bonus > 0) {
await loyaltyService.awardCorporatePoints(
deal.attributes.company_id,
deal.attributes.loyalty_points_bonus,
{ reason: 'Deal closure bonus', dealId }
);
}
break;
case 'onboard_customer':
await this.triggerOnboardingWorkflow(deal);
break;
case 'analyze_loss':
await this.logDealLoss(dealId, deal);
break;
case 'schedule_followup':
await this.createFollowUpTask(dealId, deal);
break;
}
}
}
```
#### Deal Forecasting
Generate revenue forecasts based on pipeline data:
```javascript
class DealForecasting {
async generateForecast(pipeline, timeframe) {
const deals = await this.dealsApi.getDeals({
filters: {
'attributes.pipeline': pipeline,
'attributes.close_date': `<${timeframe.end}`,
'attributes.deal_stage': '!Closed Lost'
}
});
const forecast = {
pipeline,
timeframe,
totalPipeline: 0,
weightedPipeline: 0,
byStage: {},
byOwner: {},
byMonth: {}
};
for (const deal of deals.items) {
const amount = deal.attributes.amount || 0;
const probability = deal.attributes.probability || 0;
const weighted = amount * (probability / 100);
const stage = deal.attributes.deal_stage;
const owner = deal.attributes.deal_owner;
const month = new Date(deal.attributes.close_date).toISOString().slice(0, 7);
forecast.totalPipeline += amount;
forecast.weightedPipeline += weighted;
// Aggregate by stage
if (!forecast.byStage[stage]) {
forecast.byStage[stage] = { count: 0, total: 0, weighted: 0 };
}
forecast.byStage[stage].count++;
forecast.byStage[stage].total += amount;
forecast.byStage[stage].weighted += weighted;
// Aggregate by owner
if (!forecast.byOwner[owner]) {
forecast.byOwner[owner] = { count: 0, total: 0, weighted: 0 };
}
forecast.byOwner[owner].count++;
forecast.byOwner[owner].total += amount;
forecast.byOwner[owner].weighted += weighted;
// Aggregate by month
if (!forecast.byMonth[month]) {
forecast.byMonth[month] = { count: 0, total: 0, weighted: 0 };
}
forecast.byMonth[month].count++;
forecast.byMonth[month].total += amount;
forecast.byMonth[month].weighted += weighted;
}
return forecast;
}
}
```
### E-Commerce Deal Automation
#### Automated Deal Creation from Orders
Create deals automatically from high-value e-commerce activity:
```javascript
class EcommerceDealAutomation {
async createDealFromOrder(order) {
// Only create deals for high-value or B2B orders
if (order.total < 5000 && !order.isB2B) return null;
const deal = {
name: `${order.customerName} - Order #${order.id}`,
attributes: {
deal_stage: order.isB2B ? 'Qualified' : 'Proposal',
amount: order.total,
close_date: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
pipeline: order.isB2B ? 'Enterprise Sales' : 'E-Commerce Upsell',
deal_type: 'new_business',
source: 'ecommerce_order',
order_id: order.id,
product_categories: order.categories.join(', '),
contact_id: order.contactId,
company_id: order.companyId || null,
loyalty_points_bonus: Math.floor(order.total * 0.1)
}
};
return await this.dealsApi.createDeal(deal);
}
async createRenewalDeal(subscription) {
const renewalDate = new Date(subscription.expiresAt);
const createDate = new Date(renewalDate.getTime() - 90 * 24 * 60 * 60 * 1000);
if (new Date() < createDate) return null;
const deal = {
name: `${subscription.customerName} - Renewal`,
attributes: {
deal_stage: 'Qualified',
amount: subscription.annualValue,
close_date: subscription.expiresAt,
pipeline: 'Renewals',
deal_type: 'renewal',
probability: 70,
source: 'auto_renewal',
subscription_id: subscription.id,
contact_id: subscription.contactId,
company_id: subscription.companyId,
contract_length_months: 12,
loyalty_points_bonus: Math.floor(subscription.annualValue * 0.05)
}
};
return await this.dealsApi.createDeal(deal);
}
}
```
#### Deal-Triggered Loyalty Workflows
```javascript
class DealLoyaltyIntegration {
async onDealStageChange(dealId, oldStage, newStage) {
const deal = await this.dealsApi.getDeal(dealId);
// Award milestone points at key stages
const milestoneStages = {
'Demo': 100,
'Proposal': 250,
'Closed Won': deal.attributes.loyalty_points_bonus || 1000
};
if (milestoneStages[newStage] && deal.attributes.contact_id) {
await loyaltyService.awardPoints(
deal.attributes.contact_id,
milestoneStages[newStage],
{ reason: `Deal milestone: ${newStage}`, dealId }
);
}
// Trigger tier evaluation on deal closure
if (newStage === 'Closed Won' && deal.attributes.company_id) {
const company = await this.companiesApi.getCompany(deal.attributes.company_id);
const newTotal = (company.attributes.annual_spend || 0) + deal.attributes.amount;
await this.companiesApi.updateCompany(deal.attributes.company_id, {
attributes: {
annual_spend: newTotal,
last_deal_closed: new Date().toISOString()
}
});
await this.tierManager.evaluateTierUpgrade(deal.attributes.company_id, newTotal);
}
}
}
```
### Deal Analytics
#### Pipeline Performance Metrics
```javascript
class DealAnalytics {
async getPipelineMetrics(pipeline, timeframe) {
const allDeals = await this.dealsApi.getDeals({
filters: { 'attributes.pipeline': pipeline }
});
const closedDeals = allDeals.items.filter(
d => d.attributes.deal_stage === 'Closed Won' || d.attributes.deal_stage === 'Closed Lost'
);
const wonDeals = closedDeals.filter(d => d.attributes.deal_stage === 'Closed Won');
const lostDeals = closedDeals.filter(d => d.attributes.deal_stage === 'Closed Lost');
return {
totalDeals: allDeals.total,
openDeals: allDeals.total - closedDeals.length,
wonDeals: wonDeals.length,
lostDeals: lostDeals.length,
winRate: closedDeals.length > 0
? (wonDeals.length / closedDeals.length * 100).toFixed(1)
: 0,
totalRevenue: wonDeals.reduce((sum, d) => sum + (d.attributes.amount || 0), 0),
averageDealSize: wonDeals.length > 0
? wonDeals.reduce((sum, d) => sum + (d.attributes.amount || 0), 0) / wonDeals.length
: 0,
averageSalesCycle: this.calculateAverageSalesCycle(wonDeals),
loyaltyPointsAwarded: wonDeals.reduce(
(sum, d) => sum + (d.attributes.loyalty_points_bonus || 0), 0
)
};
}
calculateAverageSalesCycle(wonDeals) {
if (wonDeals.length === 0) return 0;
const totalDays = wonDeals.reduce((sum, deal) => {
const created = new Date(deal.created_at);
const closed = new Date(deal.attributes.stage_changed_at || deal.updated_at);
return sum + Math.floor((closed - created) / (1000 * 60 * 60 * 24));
}, 0);
return Math.round(totalDays / wonDeals.length);
}
}
```
### API Methods Reference
#### Deals CRUD Operations
```javascript
// Create a new deal
const deal = await dealsApi.createDeal({
name: 'New Enterprise Deal',
attributes: {
deal_stage: 'Lead',
amount: 50000,
pipeline: 'Enterprise Sales'
}
});
// Get deal by ID
const deal = await dealsApi.getDeal('deal_abc123def456');
// Update deal attributes
await dealsApi.updateDeal('deal_abc123def456', {
attributes: {
deal_stage: 'Negotiation',
amount: 55000,
probability: 80
}
});
// Delete a deal
await dealsApi.deleteDeal('deal_abc123def456');
// List deals with filtering
const deals = await dealsApi.getDeals({
filters: {
'attributes.deal_stage': 'Qualified',
'attributes.amount': '>10000'
},
sort: 'attributes.amount:desc',
limit: 50
});
```
#### Advanced Queries
```javascript
// Find deals closing this quarter
const quarterEnd = new Date();
quarterEnd.setMonth(quarterEnd.getMonth() + 3);
const closingDeals = await dealsApi.getDeals({
filters: {
'attributes.close_date': `<${quarterEnd.toISOString()}`,
'attributes.deal_stage': '!Closed Won,!Closed Lost'
}
});
// Find high-value stale deals (no update in 14 days)
const staleDate = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000);
const staleDeals = await dealsApi.getDeals({
filters: {
'attributes.amount': '>25000',
'updated_at': `<${staleDate.toISOString()}`,
'attributes.deal_stage': '!Closed Won,!Closed Lost'
}
});
// Get deals by owner for performance review
const ownerDeals = await dealsApi.getDeals({
filters: {
'attributes.deal_owner': 'sarah.johnson@tajo.io',
'attributes.deal_stage': 'Closed Won'
}
});
```
### Best Practices
1. **Consistent stages**: Define clear pipeline stages with expected actions at each stage
2. **Probability tracking**: Keep deal probabilities updated to improve forecast accuracy
3. **Timely updates**: Update deal attributes promptly to maintain accurate pipeline visibility
4. **Loyalty integration**: Link deal closures to loyalty point awards for customer retention
5. **Automated workflows**: Use stage-change triggers to automate follow-up tasks
6. **Regular pipeline review**: Schedule weekly pipeline reviews to identify stale or at-risk deals
### Error Handling
```javascript
try {
const deal = await dealsApi.createDeal(dealData);
console.log('Deal created:', deal.id);
} catch (error) {
if (error.status === 400) {
console.error('Invalid deal data:', error.message);
} else if (error.status === 404) {
console.error('Associated company or contact not found');
} else if (error.status === 409) {
console.error('Duplicate deal detected');
} else {
console.error('Unexpected error:', error);
}
}
```
### Next Steps
- **[Companies Management](/docs/sales-crm/companies)** - Manage B2B corporate accounts
- **[Task Management](/docs/sales-crm/tasks)** - Manage deal activities and follow-ups
- **[Notes and Files](/docs/sales-crm/notes)** - Document deal interactions
- **CRM Analytics** - Advanced reporting and insights
### Frequently asked questions
**How do I create a deal in Brevo CRM through the API?**
POST to https://api.brevo.com/v3/crm/deals with your api-key header and a body with the deal name and an attributes object such as deal_stage, amount, close_date, pipeline, deal_owner, deal_type, probability, company_id and contact_id. The response returns the deal id.
**How do I update a deal's stage or amount in Brevo?**
PATCH https://api.brevo.com/v3/crm/deals/{deal_id} with an attributes object holding the changed fields, for example deal_stage Negotiation, amount 82000 and probability 75.
**How do I filter deals by stage in Brevo CRM?**
GET https://api.brevo.com/v3/crm/deals with a filter such as filters[attributes.deal_stage]=Negotiation and a sort such as sort=attributes.amount:desc, plus limit and offset for pagination.
**How do I forecast revenue from the Brevo deal pipeline?**
List the open deals in a pipeline closing before a date, excluding Closed Lost, then sum amounts for the total pipeline and amount times probability for the weighted pipeline, grouped by stage, owner or month.
**What deal pipeline metrics can I compute from Brevo CRM?**
Total, open, won and lost deals, win rate as won over closed, total revenue from won deals, average deal size, and average sales cycle from created to closed dates.
---
## Files Management
Source: https://tajo.io/docs/sales-crm/files/
Upload and manage file attachments in Brevo CRM for Tajo deal documentation
The Brevo CRM Files API enables you to upload and manage file attachments associated with contacts, companies, and deals within the Tajo platform.
### Overview
File management is essential for:
- **Deal documentation** storing proposals, contracts, and agreements
- **Customer records** attaching invoices, receipts, and correspondence
- **Loyalty program materials** sharing program details and benefit summaries
- **Compliance** maintaining document audit trails for enterprise accounts
- **Team collaboration** sharing resources across sales team members
### Quick Start
#### Upload File
```http
POST https://api.brevo.com/v3/crm/files
Content-Type: multipart/form-data
api-key: YOUR_API_KEY
--boundary
Content-Disposition: form-data; name="file"; filename="enterprise-proposal.pdf"
Content-Type: application/pdf
[file content]
--boundary
Content-Disposition: form-data; name="dealIds"
deal_abc123def456
--boundary
Content-Disposition: form-data; name="companyIds"
comp_123456789
--boundary
Content-Disposition: form-data; name="contactIds"
12345
--boundary--
```
#### Response
```json
{
"id": "file_001",
"name": "enterprise-proposal.pdf",
"size": 245760,
"contentType": "application/pdf",
"dealIds": ["deal_abc123def456"],
"companyIds": ["comp_123456789"],
"contactIds": [12345],
"created_at": "2026-01-25T14:30:00Z"
}
```
### Get Files
#### List All Files
```http
GET https://api.brevo.com/v3/crm/files?limit=50&offset=0&sort=desc
Content-Type: application/json
api-key: YOUR_API_KEY
```
#### Response
```json
{
"items": [
{
"id": "file_001",
"name": "enterprise-proposal.pdf",
"size": 245760,
"contentType": "application/pdf",
"dealIds": ["deal_abc123def456"],
"companyIds": ["comp_123456789"],
"created_at": "2026-01-25T14:30:00Z"
}
],
"total": 1
}
```
#### Filter Files
```http
GET https://api.brevo.com/v3/crm/files?filters[dealIds]=deal_abc123def456&sort=created_at:desc
```
#### Get Single File
```http
GET https://api.brevo.com/v3/crm/files/{file_id}
Content-Type: application/json
api-key: YOUR_API_KEY
```
#### Download File
```http
GET https://api.brevo.com/v3/crm/files/{file_id}/data
api-key: YOUR_API_KEY
```
### File Management Automation
#### Deal Document Workflow
Automatically manage documents throughout the deal lifecycle:
```javascript
class DealDocumentManager {
constructor() {
this.filesApi = new FilesApi();
}
async attachProposal(dealId, proposalBuffer, companyName) {
const fileName = `proposal-${companyName.toLowerCase().replace(/\s+/g, '-')}-${Date.now()}.pdf`;
const file = await this.filesApi.uploadFile({
file: proposalBuffer,
fileName: fileName,
dealIds: [dealId]
});
// Create a note referencing the uploaded proposal
await this.notesApi.createNote({
text: `Proposal uploaded: ${fileName}`,
dealIds: [dealId]
});
return file;
}
async attachContract(dealId, contractBuffer, companyId) {
const fileName = `contract-${dealId}-${new Date().toISOString().slice(0, 10)}.pdf`;
const file = await this.filesApi.uploadFile({
file: contractBuffer,
fileName: fileName,
dealIds: [dealId],
companyIds: [companyId]
});
return file;
}
async getDealDocuments(dealId) {
const files = await this.filesApi.getFiles({
filters: { dealIds: dealId },
sort: 'created_at:desc'
});
return {
proposals: files.items.filter(f => f.name.startsWith('proposal-')),
contracts: files.items.filter(f => f.name.startsWith('contract-')),
other: files.items.filter(f =>
!f.name.startsWith('proposal-') && !f.name.startsWith('contract-')
),
totalSize: files.items.reduce((sum, f) => sum + f.size, 0)
};
}
}
```
#### Loyalty Program Documents
```javascript
class LoyaltyDocumentManager {
async generateAndAttachBenefitsSummary(companyId, tier) {
const company = await this.companiesApi.getCompany(companyId);
const summary = await this.generateBenefitsPDF({
companyName: company.name,
tier: tier,
benefits: this.getTierBenefits(tier),
annualSpend: company.attributes.annual_spend,
pointsBalance: company.attributes.loyalty_points
});
return await this.filesApi.uploadFile({
file: summary,
fileName: `loyalty-benefits-${tier.toLowerCase().replace(/\s+/g, '-')}.pdf`,
companyIds: [companyId]
});
}
async attachTierUpgradeDocuments(companyId, oldTier, newTier) {
const documents = [
{ name: 'tier-upgrade-confirmation', content: this.generateUpgradeConfirmation(oldTier, newTier) },
{ name: 'new-benefits-guide', content: this.generateBenefitsGuide(newTier) }
];
const uploaded = [];
for (const doc of documents) {
const file = await this.filesApi.uploadFile({
file: doc.content,
fileName: `${doc.name}-${Date.now()}.pdf`,
companyIds: [companyId]
});
uploaded.push(file);
}
return uploaded;
}
}
```
### Supported File Types
| Category | Extensions | Max Size |
|----------|-----------|----------|
| Documents | `.pdf`, `.doc`, `.docx`, `.txt` | 10 MB |
| Spreadsheets | `.xls`, `.xlsx`, `.csv` | 10 MB |
| Images | `.png`, `.jpg`, `.jpeg`, `.gif` | 5 MB |
| Presentations | `.ppt`, `.pptx` | 10 MB |
### API Methods Reference
```javascript
// Upload a file
const file = await filesApi.uploadFile({
file: fileBuffer,
fileName: 'proposal.pdf',
dealIds: ['deal_abc123'],
companyIds: ['comp_123']
});
// Get file metadata
const file = await filesApi.getFile('file_001');
// Download file data
const fileData = await filesApi.downloadFile('file_001');
// Delete file
await filesApi.deleteFile('file_001');
// List files with filtering
const files = await filesApi.getFiles({
filters: { dealIds: 'deal_abc123' },
sort: 'created_at:desc',
limit: 50
});
```
### Best Practices
1. **Naming conventions**: Use descriptive file names with dates for easy identification
2. **Link records**: Associate files with all related deals, companies, and contacts
3. **Version management**: Include version numbers or dates in file names
4. **Size management**: Compress large files before uploading
5. **Access control**: Review file associations regularly to ensure proper access
6. **Clean up**: Remove outdated documents to keep CRM records manageable
### Error Handling
```javascript
try {
const file = await filesApi.uploadFile(fileData);
console.log('File uploaded:', file.id);
} catch (error) {
if (error.status === 400) {
console.error('Invalid file data:', error.message);
} else if (error.status === 413) {
console.error('File size exceeds maximum limit');
} else if (error.status === 415) {
console.error('Unsupported file type');
} else {
console.error('Unexpected error:', error);
}
}
```
### Next Steps
- **[Companies Management](/docs/sales-crm/companies)** - Manage corporate accounts
- **[Deals Management](/docs/sales-crm/deals)** - Track sales pipeline
- **[Task Management](/docs/sales-crm/tasks)** - Manage sales activities
- **[Notes](/docs/sales-crm/notes)** - Document customer interactions
### Frequently asked questions
**How do I upload a file to Brevo CRM?**
POST multipart form data to https://api.brevo.com/v3/crm/files with your api-key header: the file part plus dealIds, companyIds or contactIds parts naming the records to attach it to. The response returns the file id, name, size and contentType.
**Which file types and sizes does Brevo CRM accept?**
Documents such as pdf, doc, docx and txt up to 10 MB; spreadsheets xls, xlsx and csv up to 10 MB; images png, jpg, jpeg and gif up to 5 MB; presentations ppt and pptx up to 10 MB.
**How do I download or list files in Brevo CRM?**
List with GET /v3/crm/files using limit, offset and sort, filter by record such as filters[dealIds]=deal_abc, read metadata at /v3/crm/files/{file_id}, and download the content from /v3/crm/files/{file_id}/data.
**What do 413 and 415 errors mean when uploading to Brevo CRM?**
413 means the file exceeds the maximum size, 415 means the file type is unsupported, and 400 means the file data is invalid. Compress large files before uploading.
---
## Sales CRM
Source: https://tajo.io/docs/sales-crm/
Manage your complete sales pipeline with Brevo CRM integration for Tajo e-commerce
The Brevo Sales CRM integration gives Tajo users a complete customer relationship management system to track leads, manage deals, and grow revenue alongside your loyalty and marketing programs.
### Overview
Tajo's CRM integration connects your e-commerce platform with Brevo's Sales CRM to provide:
- **Unified customer view** combining purchase history, loyalty data, and sales interactions
- **Deal pipeline management** with automated stage progression and revenue forecasting
- **Company management** for B2B relationships and corporate loyalty programs
- **Task and activity tracking** to keep your sales team organized and productive
- **Notes and file management** for complete interaction history
### CRM Modules
#### Companies
Manage B2B corporate accounts with enterprise loyalty program integration, multi-location support, and tier-based benefits management.
```http
POST https://api.brevo.com/v3/companies
GET https://api.brevo.com/v3/companies
PATCH https://api.brevo.com/v3/companies/{id}
```
[View Companies Documentation →](/docs/sales-crm/companies)
#### Deals
Track sales opportunities through your pipeline with automated loyalty point awards, revenue forecasting, and e-commerce order integration.
```http
POST https://api.brevo.com/v3/crm/deals
GET https://api.brevo.com/v3/crm/deals
PATCH https://api.brevo.com/v3/crm/deals/{id}
```
[View Deals Documentation →](/docs/sales-crm/deals)
#### Tasks
Create and manage sales activities, follow-ups, and reminders to keep your team on track and ensure no opportunity is missed.
```http
POST https://api.brevo.com/v3/crm/tasks
GET https://api.brevo.com/v3/crm/tasks
```
[View Tasks Documentation →](/docs/sales-crm/tasks)
#### Notes
Document customer interactions, meeting summaries, and important details associated with contacts, companies, and deals.
```http
POST https://api.brevo.com/v3/crm/notes
GET https://api.brevo.com/v3/crm/notes
```
[View Notes Documentation →](/docs/sales-crm/notes)
#### Files
Attach proposals, contracts, and documents to CRM records for complete deal documentation.
```http
POST https://api.brevo.com/v3/crm/files
GET https://api.brevo.com/v3/crm/files
```
[View Files Documentation →](/docs/sales-crm/files)
### Quick Start
#### 1. Set Up Your Pipeline
Configure deal stages that match your sales process:
```javascript
const pipeline = {
name: 'E-Commerce Enterprise Sales',
stages: [
{ name: 'Lead', probability: 10 },
{ name: 'Qualified', probability: 25 },
{ name: 'Demo', probability: 40 },
{ name: 'Proposal', probability: 60 },
{ name: 'Negotiation', probability: 80 },
{ name: 'Closed Won', probability: 100 },
{ name: 'Closed Lost', probability: 0 }
]
};
```
#### 2. Create a Deal
```javascript
const deal = await dealsApi.createDeal({
name: 'Acme Corp - Enterprise Package',
attributes: {
deal_stage: 'Qualified',
amount: 75000,
close_date: '2026-06-30',
pipeline: 'E-Commerce Enterprise Sales',
deal_owner: 'sarah@tajo.io',
loyalty_points_bonus: 5000
}
});
```
#### 3. Link to Loyalty Program
Automatically award loyalty points when deals close:
```javascript
async function onDealClosed(dealId) {
const deal = await dealsApi.getDeal(dealId);
if (deal.attributes.deal_stage === 'Closed Won') {
await loyaltyService.awardPoints(
deal.attributes.contact_id,
deal.attributes.loyalty_points_bonus,
{ reason: 'Deal closure bonus', dealId }
);
}
}
```
### Authentication
All CRM API requests require your Brevo API key:
```http
api-key: YOUR_API_KEY
```
Include this header in every request. You can find your API key in the Brevo dashboard under **Settings → SMTP & API → API Keys**.
### Next Steps
- **[Companies](/docs/sales-crm/companies)** - Set up corporate accounts
- **[Deals](/docs/sales-crm/deals)** - Manage your sales pipeline
- **[Tasks](/docs/sales-crm/tasks)** - Track sales activities
- **[Notes](/docs/sales-crm/notes)** - Document customer interactions
- **[Files](/docs/sales-crm/files)** - Manage deal attachments
### Frequently asked questions
**What does the Sales CRM integration include?**
Five modules: companies for B2B accounts, deals for the sales pipeline, tasks for activities and follow-ups, notes for interaction history, and files for attachments such as proposals and contracts.
**Which endpoints manage deals, companies and tasks in Brevo?**
Companies use POST, GET and PATCH on /v3/companies. Deals use POST, GET and PATCH on /v3/crm/deals. Tasks, notes and files use POST and GET on /v3/crm/tasks, /v3/crm/notes and /v3/crm/files.
**Where do I find my API key for the Brevo CRM API, and how do I authenticate?**
Send your Brevo API key in the api-key header on every request. You find the key in the Brevo dashboard under Settings, SMTP & API, API Keys.
**How do I create a deal in Brevo?**
Call createDeal with a name and attributes such as deal_stage, amount, close_date, pipeline and deal_owner. Define pipeline stages first, for example Lead, Qualified, Demo, Proposal, Negotiation, Closed Won and Closed Lost, each with a probability.
---
## Notes Management
Source: https://tajo.io/docs/sales-crm/notes/
Create and manage customer notes and interaction records in Brevo CRM for Tajo
The Brevo CRM Notes API enables you to document customer interactions, meeting summaries, and important details associated with contacts, companies, and deals within the Tajo platform.
### Overview
Notes management is essential for:
- **Interaction history** documenting customer conversations and meeting outcomes
- **Team collaboration** sharing context about accounts across your sales team
- **Deal documentation** recording negotiation details and decisions
- **Loyalty program notes** tracking customer preferences and program feedback
- **Compliance records** maintaining audit trails for customer communications
### Quick Start
#### Create Note
```http
POST https://api.brevo.com/v3/crm/notes
Content-Type: application/json
api-key: YOUR_API_KEY
{
"text": "Met with Acme Corp to discuss enterprise loyalty program upgrade. They're interested in Diamond tier benefits and want to consolidate all 12 locations under a single account. Key decision maker is VP of Operations. Follow up with volume discount proposal by end of week.",
"contactIds": [12345],
"dealIds": ["deal_abc123def456"],
"companyIds": ["comp_123456789"]
}
```
#### Response
```json
{
"id": "note_001",
"text": "Met with Acme Corp to discuss enterprise loyalty program upgrade...",
"contactIds": [12345],
"dealIds": ["deal_abc123def456"],
"companyIds": ["comp_123456789"],
"created_at": "2026-01-25T14:30:00Z",
"updated_at": "2026-01-25T14:30:00Z"
}
```
### Get Notes
#### List All Notes
```http
GET https://api.brevo.com/v3/crm/notes?limit=50&offset=0&sort=desc
Content-Type: application/json
api-key: YOUR_API_KEY
```
#### Response
```json
{
"items": [
{
"id": "note_001",
"text": "Met with Acme Corp to discuss enterprise loyalty program upgrade...",
"contactIds": [12345],
"dealIds": ["deal_abc123def456"],
"companyIds": ["comp_123456789"],
"created_at": "2026-01-25T14:30:00Z"
}
],
"total": 1
}
```
#### Filter Notes
```http
GET https://api.brevo.com/v3/crm/notes?filters[companyIds]=comp_123456789&sort=created_at:desc
```
#### Get Single Note
```http
GET https://api.brevo.com/v3/crm/notes/{note_id}
Content-Type: application/json
api-key: YOUR_API_KEY
```
### Automated Note Creation
#### Activity-Based Notes
Create notes automatically from CRM activities:
```javascript
class NoteAutomation {
constructor() {
this.notesApi = new NotesApi();
}
async logDealStageChange(deal, oldStage, newStage) {
const noteText = [
`Deal stage changed: ${oldStage} → ${newStage}`,
`Deal value: $${deal.attributes.amount?.toLocaleString()}`,
`Probability: ${deal.attributes.probability}%`,
newStage === 'Closed Won'
? `Loyalty points awarded: ${deal.attributes.loyalty_points_bonus}`
: '',
`Updated by: ${deal.attributes.deal_owner}`
].filter(Boolean).join('\n');
return await this.notesApi.createNote({
text: noteText,
dealIds: [deal.id],
companyIds: deal.attributes.company_id ? [deal.attributes.company_id] : [],
contactIds: deal.attributes.contact_id ? [deal.attributes.contact_id] : []
});
}
async logLoyaltyTierChange(company, oldTier, newTier) {
const noteText = [
`Loyalty tier upgraded: ${oldTier} → ${newTier}`,
`Annual spend: $${company.attributes.annual_spend?.toLocaleString()}`,
`New benefits: ${this.getTierBenefits(newTier).join(', ')}`,
`Account manager notified: ${company.attributes.account_manager}`
].join('\n');
return await this.notesApi.createNote({
text: noteText,
companyIds: [company.id]
});
}
async logCustomerFeedback(contactId, feedback) {
const noteText = [
`Customer feedback received:`,
`Category: ${feedback.category}`,
`Rating: ${feedback.rating}/5`,
`Comment: ${feedback.comment}`,
feedback.loyaltyRelated ? `Loyalty program feedback: ${feedback.loyaltyComment}` : ''
].filter(Boolean).join('\n');
return await this.notesApi.createNote({
text: noteText,
contactIds: [contactId]
});
}
}
```
#### Meeting Summary Notes
```javascript
class MeetingNotes {
async createMeetingSummary(meetingData) {
const noteText = [
`Meeting: ${meetingData.title}`,
`Date: ${new Date(meetingData.date).toLocaleDateString()}`,
`Attendees: ${meetingData.attendees.join(', ')}`,
'',
'## Discussion Points',
...meetingData.topics.map(t => `- ${t}`),
'',
'## Action Items',
...meetingData.actions.map(a => `- [ ] ${a.description} (${a.assignee}, due ${a.dueDate})`),
'',
'## Next Steps',
meetingData.nextSteps
].join('\n');
return await this.notesApi.createNote({
text: noteText,
contactIds: meetingData.contactIds || [],
dealIds: meetingData.dealIds || [],
companyIds: meetingData.companyIds || []
});
}
}
```
### API Methods Reference
```javascript
// Create a note
const note = await notesApi.createNote({
text: 'Customer interested in premium loyalty tier',
contactIds: [12345],
dealIds: ['deal_abc123']
});
// Get note by ID
const note = await notesApi.getNote('note_001');
// Update note
await notesApi.updateNote('note_001', {
text: 'Updated: Customer confirmed interest in premium loyalty tier. Meeting scheduled for next week.'
});
// Delete note
await notesApi.deleteNote('note_001');
// List notes with filtering
const notes = await notesApi.getNotes({
filters: { companyIds: 'comp_123456789' },
sort: 'created_at:desc',
limit: 50
});
```
### Best Practices
1. **Be specific**: Include relevant details like amounts, dates, and next steps
2. **Link records**: Associate notes with all related contacts, deals, and companies
3. **Automate logging**: Create notes automatically for stage changes and key events
4. **Use consistent format**: Adopt a team-wide note structure for meeting summaries
5. **Timely documentation**: Create notes immediately after interactions while details are fresh
### Error Handling
```javascript
try {
const note = await notesApi.createNote(noteData);
console.log('Note created:', note.id);
} catch (error) {
if (error.status === 400) {
console.error('Invalid note data:', error.message);
} else if (error.status === 404) {
console.error('Associated contact, deal, or company not found');
} else {
console.error('Unexpected error:', error);
}
}
```
### Next Steps
- **[Companies Management](/docs/sales-crm/companies)** - Manage corporate accounts
- **[Deals Management](/docs/sales-crm/deals)** - Track sales pipeline
- **[Task Management](/docs/sales-crm/tasks)** - Manage sales activities
- **[Files](/docs/sales-crm/files)** - Manage deal attachments
### Frequently asked questions
**How do I create a note and attach it to a contact, deal or company in Brevo CRM?**
POST to https://api.brevo.com/v3/crm/notes with your api-key header and a body holding the note text plus the records it belongs to: contactIds, dealIds and companyIds. The response returns the note's id and timestamps.
**How do I list or filter notes in Brevo CRM?**
GET https://api.brevo.com/v3/crm/notes with limit, offset and sort, or filter by record with a query such as filters[companyIds]=comp_123 and sort=created_at:desc. A single note is read at /v3/crm/notes/{note_id}.
**Can I update or delete a Brevo CRM note?**
Yes. Use updateNote with the note id and new text, or deleteNote with the id. Notes can also be created automatically for events such as a deal stage change or customer feedback.
**What do 400 and 404 errors mean when creating a Brevo CRM note?**
400 means the note data is invalid; 404 means an associated contact, deal or company was not found. Link notes to all related records and create them right after the interaction.
---
## Task Management
Source: https://tajo.io/docs/sales-crm/tasks/
Create and manage sales tasks, follow-ups, and activities in Brevo CRM for Tajo
The Brevo CRM Tasks API enables you to create and manage sales activities, follow-ups, and reminders to keep your team organized within the Tajo platform.
### Overview
Task management is essential for:
- **Sales follow-ups** with automated reminders and due dates
- **Team coordination** assigning activities to specific team members
- **Deal progression** linking tasks to deals and companies
- **Activity tracking** monitoring team productivity and completion rates
- **Customer engagement** scheduling loyalty program outreach and check-ins
### Quick Start
#### Create Task
```http
POST https://api.brevo.com/v3/crm/tasks
Content-Type: application/json
api-key: YOUR_API_KEY
{
"name": "Follow up on Enterprise Loyalty proposal",
"taskType": "call",
"date": "2026-02-15T10:00:00Z",
"duration": 1800,
"notes": "Discuss volume discount tier and loyalty point allocation",
"assignTo": "sarah.johnson@tajo.io",
"companiesIds": ["comp_123456789"],
"dealsIds": ["deal_abc123def456"],
"contactsIds": [12345],
"done": false,
"reminder": {
"value": 15,
"unit": "minutes"
}
}
```
#### Response
```json
{
"id": "task_xyz789",
"name": "Follow up on Enterprise Loyalty proposal",
"taskType": "call",
"date": "2026-02-15T10:00:00Z",
"done": false,
"created_at": "2026-01-25T14:30:00Z"
}
```
### Get Tasks
#### List All Tasks
```http
GET https://api.brevo.com/v3/crm/tasks?limit=50&offset=0&sort=desc
Content-Type: application/json
api-key: YOUR_API_KEY
```
#### Response
```json
{
"items": [
{
"id": "task_xyz789",
"name": "Follow up on Enterprise Loyalty proposal",
"taskType": "call",
"date": "2026-02-15T10:00:00Z",
"duration": 1800,
"assignTo": "sarah.johnson@tajo.io",
"done": false,
"companiesIds": ["comp_123456789"],
"dealsIds": ["deal_abc123def456"],
"created_at": "2026-01-25T14:30:00Z"
}
],
"total": 1
}
```
#### Filter Tasks
```http
GET https://api.brevo.com/v3/crm/tasks?filters[done]=false&filters[taskType]=call&sort=date:asc
```
#### Get Single Task
```http
GET https://api.brevo.com/v3/crm/tasks/{task_id}
Content-Type: application/json
api-key: YOUR_API_KEY
```
### Task Types
The CRM supports several task types for different sales activities:
| Type | Description | Use Case |
|------|-------------|----------|
| `call` | Phone call | Follow-up calls, demos, check-ins |
| `email` | Email outreach | Proposals, updates, newsletters |
| `meeting` | In-person or virtual meeting | Demos, negotiations, reviews |
| `todo` | General task | Internal work, research, prep |
| `deadline` | Time-sensitive task | Contract renewals, milestones |
### Automated Task Creation
#### Deal-Based Task Automation
Create tasks automatically when deals progress through stages:
```javascript
class TaskAutomation {
constructor() {
this.tasksApi = new TasksApi();
}
async createDealFollowUp(deal, stageChange) {
const taskTemplates = {
'Lead': {
name: `Qualify lead: ${deal.name}`,
taskType: 'call',
daysFromNow: 1,
duration: 900
},
'Qualified': {
name: `Schedule demo: ${deal.name}`,
taskType: 'meeting',
daysFromNow: 3,
duration: 3600
},
'Demo': {
name: `Send proposal: ${deal.name}`,
taskType: 'email',
daysFromNow: 1,
duration: 1800
},
'Proposal': {
name: `Follow up on proposal: ${deal.name}`,
taskType: 'call',
daysFromNow: 5,
duration: 900
},
'Negotiation': {
name: `Finalize contract: ${deal.name}`,
taskType: 'deadline',
daysFromNow: 7,
duration: 3600
},
'Closed Won': {
name: `Onboard customer: ${deal.name}`,
taskType: 'meeting',
daysFromNow: 2,
duration: 3600
}
};
const template = taskTemplates[stageChange.newStage];
if (!template) return null;
const taskDate = new Date();
taskDate.setDate(taskDate.getDate() + template.daysFromNow);
return await this.tasksApi.createTask({
name: template.name,
taskType: template.taskType,
date: taskDate.toISOString(),
duration: template.duration,
assignTo: deal.attributes.deal_owner,
dealsIds: [deal.id],
companiesIds: deal.attributes.company_id ? [deal.attributes.company_id] : [],
contactsIds: deal.attributes.contact_id ? [deal.attributes.contact_id] : [],
done: false,
reminder: { value: 30, unit: 'minutes' }
});
}
async createLoyaltyCheckIn(company) {
return await this.tasksApi.createTask({
name: `Loyalty program check-in: ${company.name}`,
taskType: 'call',
date: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
duration: 1800,
assignTo: company.attributes.account_manager,
companiesIds: [company.id],
notes: `Review tier status: ${company.attributes.loyalty_tier}\nAnnual spend: $${company.attributes.annual_spend}`,
done: false,
reminder: { value: 1, unit: 'days' }
});
}
}
```
#### Bulk Task Operations
```javascript
class BulkTaskManager {
async createRenewalTasks(daysBeforeExpiry = 90) {
const renewalDate = new Date();
renewalDate.setDate(renewalDate.getDate() + daysBeforeExpiry);
const companies = await this.companiesApi.getCompanies({
filters: {
'attributes.renewal_date': `<${renewalDate.toISOString()}`
}
});
const tasks = [];
for (const company of companies.items) {
const task = await this.tasksApi.createTask({
name: `Contract renewal: ${company.name}`,
taskType: 'deadline',
date: company.attributes.renewal_date,
assignTo: company.attributes.account_manager,
companiesIds: [company.id],
notes: `Contract value: $${company.attributes.contract_value}\nCurrent tier: ${company.attributes.loyalty_tier}`,
done: false,
reminder: { value: 7, unit: 'days' }
});
tasks.push(task);
}
return tasks;
}
}
```
### API Methods Reference
```javascript
// Create a new task
const task = await tasksApi.createTask({
name: 'Follow up call',
taskType: 'call',
date: '2026-02-15T10:00:00Z',
assignTo: 'sales@tajo.io',
done: false
});
// Get task by ID
const task = await tasksApi.getTask('task_xyz789');
// Update task
await tasksApi.updateTask('task_xyz789', {
done: true,
notes: 'Customer agreed to upgrade tier'
});
// Delete task
await tasksApi.deleteTask('task_xyz789');
// List tasks with filtering
const tasks = await tasksApi.getTasks({
filters: {
done: false,
taskType: 'call',
assignTo: 'sarah@tajo.io'
},
sort: 'date:asc',
limit: 50
});
```
### Best Practices
1. **Automate task creation**: Link tasks to deal stage changes for consistent follow-up
2. **Set reminders**: Always configure reminders for time-sensitive tasks
3. **Link records**: Associate tasks with deals, companies, and contacts for context
4. **Track completion**: Monitor task completion rates for team performance insights
5. **Use task types**: Categorize tasks properly for accurate activity reporting
### Error Handling
```javascript
try {
const task = await tasksApi.createTask(taskData);
console.log('Task created:', task.id);
} catch (error) {
if (error.status === 400) {
console.error('Invalid task data:', error.message);
} else if (error.status === 404) {
console.error('Associated deal or contact not found');
} else {
console.error('Unexpected error:', error);
}
}
```
### Next Steps
- **[Companies Management](/docs/sales-crm/companies)** - Manage corporate accounts
- **[Deals Management](/docs/sales-crm/deals)** - Track sales pipeline
- **[Notes](/docs/sales-crm/notes)** - Document customer interactions
- **[Files](/docs/sales-crm/files)** - Manage deal attachments
### Frequently asked questions
**How do I create a task in Brevo CRM through the API?**
POST to https://api.brevo.com/v3/crm/tasks with your api-key header and a body with name, taskType, date, duration in seconds, notes, assignTo, the linked companiesIds, dealsIds and contactsIds, done, and an optional reminder with a value and unit.
**What task types does Brevo CRM support?**
Five: call for follow-ups, demos and check-ins; email for proposals and updates; meeting for in-person or virtual meetings; todo for internal work; and deadline for time-sensitive items such as contract renewals.
**How do I list open tasks in Brevo CRM?**
GET https://api.brevo.com/v3/crm/tasks with filters, for example filters[done]=false and filters[taskType]=call, plus sort=date:asc, limit and offset. A single task is read at /v3/crm/tasks/{task_id}.
**How do I mark a Brevo CRM task as done?**
Update the task with done set to true, optionally adding notes about the outcome.
**Can tasks be created automatically when a deal changes stage?**
Yes. The page shows a pattern that maps each deal stage to a task template, for example Qualify lead one day after Lead, Schedule demo three days after Qualified, and Finalize contract as a deadline seven days after Negotiation, assigned to the deal owner with a reminder.
---
## SDKs & Libraries
Source: https://tajo.io/docs/sdks-libraries/
Official and community SDKs for the Brevo API
Brevo provides official SDKs and libraries to help you integrate with our API more easily.
### Official SDKs
#### PHP SDK
```bash
composer require brevo/brevo-php
```
#### Node.js SDK
```bash
npm install @getbrevo/brevo
```
#### Python SDK
```bash
pip install brevo-python
```
#### Ruby SDK
```bash
gem install brevo-ruby
```
### Community Libraries
- **Go**: Community-maintained Go client
- **Java**: Third-party Java wrapper
- **C#**: Community .NET library
### Getting Started
Each SDK includes comprehensive documentation and examples. Choose your preferred language and follow the setup guide.
### Frequently asked questions
**Which official SDKs does Brevo provide?**
Four official SDKs: PHP with composer require brevo/brevo-php, Node.js with npm install @getbrevo/brevo, Python with pip install brevo-python, and Ruby with gem install brevo-ruby.
**Is there a Brevo SDK for Go, Java or C#?**
Not an official one. Go has a community-maintained client, Java a third-party wrapper, and C# a community .NET library.
**How do I install the Brevo Node.js SDK?**
Run npm install @getbrevo/brevo. Each SDK ships with documentation and examples, so pick your language and follow its setup guide.
---
## JavaScript SDK
Source: https://tajo.io/docs/sdks-libraries/javascript-sdk/
Official JavaScript SDK for Brevo API integration with Tajo
The official JavaScript SDK provides a convenient way to interact with Brevo's API from your Node.js applications and browser environments.
### Installation
```bash
# Using npm
npm install @getbrevo/brevo
# Using yarn
yarn add @getbrevo/brevo
# Using pnpm
pnpm add @getbrevo/brevo
```
### Quick Start
#### Initialize the SDK
```javascript
import { ApiClient, TransactionalEmailsApi, ContactsApi, EventsApi } from '@getbrevo/brevo';
// Configure API client
const defaultClient = ApiClient.instance;
const apiKey = defaultClient.authentications['api-key'];
apiKey.apiKey = 'your-brevo-api-key';
// Initialize API instances
const emailApi = new TransactionalEmailsApi();
const contactsApi = new ContactsApi();
const eventsApi = new EventsApi();
```
#### Environment Configuration
```javascript
// .env file
BREVO_API_KEY=xkeysib-your-api-key-here
BREVO_API_URL=https://api.brevo.com/v3
TAJO_WEBHOOK_SECRET=your-webhook-secret
// config.js
export const brevoConfig = {
apiKey: process.env.BREVO_API_KEY,
apiUrl: process.env.BREVO_API_URL || 'https://api.brevo.com/v3',
webhookSecret: process.env.TAJO_WEBHOOK_SECRET
};
```
### Core Features
#### 1. Customer Management
```javascript
class TajoCustomerService {
constructor() {
this.contactsApi = new ContactsApi();
}
// Create new loyalty customer
async createCustomer(customerData) {
const createContact = {
email: customerData.email,
attributes: {
FIRSTNAME: customerData.firstName,
LASTNAME: customerData.lastName,
PHONE: customerData.phone,
LOYALTY_ID: customerData.loyaltyId,
LOYALTY_POINTS: customerData.points || 0,
LOYALTY_TIER: customerData.tier || 'Bronze',
SIGNUP_DATE: new Date().toISOString(),
TOTAL_SPENT: customerData.totalSpent || 0,
PREFERRED_CATEGORIES: customerData.categories || [],
BIRTHDAY: customerData.birthday,
MARKETING_CONSENT: customerData.marketingConsent || true
},
listIds: [this.getListForTier(customerData.tier || 'Bronze')],
updateEnabled: true
};
try {
const response = await this.contactsApi.createContact(createContact);
console.log('Customer created in Brevo:', response.id);
return response;
} catch (error) {
console.error('Error creating customer:', error);
throw error;
}
}
// Update customer loyalty data
async updateCustomer(email, updates) {
const updateContact = {
attributes: updates,
listIds: updates.LOYALTY_TIER ? [this.getListForTier(updates.LOYALTY_TIER)] : undefined
};
try {
await this.contactsApi.updateContact(email, updateContact);
console.log('Customer updated:', email);
} catch (error) {
console.error('Error updating customer:', error);
throw error;
}
}
// Get customer by email
async getCustomer(email) {
try {
const response = await this.contactsApi.getContactInfo(email);
return response;
} catch (error) {
if (error.status === 404) {
return null; // Customer not found
}
throw error;
}
}
// Helper method to get list ID for tier
getListForTier(tier) {
const tierLists = {
'Bronze': 1,
'Silver': 2,
'Gold': 3,
'Platinum': 4
};
return tierLists[tier] || 1;
}
}
```
#### 2. Transactional Emails
```javascript
class TajoEmailService {
constructor() {
this.emailApi = new TransactionalEmailsApi();
}
// Send loyalty points earned notification
async sendPointsEarnedEmail(customerEmail, orderData) {
const sendSmtpEmail = {
sender: {
name: "Tajo Loyalty",
email: "loyalty@yourdomain.com"
},
to: [{
email: customerEmail,
name: orderData.customerName
}],
subject: `You earned ${orderData.pointsEarned} loyalty points!`,
htmlContent: this.generatePointsEmailHTML(orderData),
textContent: this.generatePointsEmailText(orderData),
params: {
customerName: orderData.customerName,
pointsEarned: orderData.pointsEarned,
orderNumber: orderData.orderNumber,
totalPoints: orderData.totalPoints
},
tags: ['loyalty', 'points-earned']
};
try {
const response = await this.emailApi.sendTransacEmail(sendSmtpEmail);
return response;
} catch (error) {
console.error('Error sending points email:', error);
throw error;
}
}
// Send tier upgrade notification
async sendTierUpgradeEmail(customerEmail, upgradeData) {
const sendSmtpEmail = {
templateId: this.getTierUpgradeTemplateId(upgradeData.newTier),
to: [{ email: customerEmail }],
params: {
customerName: upgradeData.customerName,
newTier: upgradeData.newTier,
previousTier: upgradeData.previousTier,
benefits: upgradeData.benefits,
pointsBalance: upgradeData.pointsBalance
},
tags: ['loyalty', 'tier-upgrade', upgradeData.newTier.toLowerCase()]
};
return await this.emailApi.sendTransacEmail(sendSmtpEmail);
}
// Generate HTML content for points email
generatePointsEmailHTML(orderData) {
return `
🎉 Great news, ${orderData.customerName}!
You've earned ${orderData.pointsEarned} points from your recent purchase!
`;
}
generatePointsEmailText(orderData) {
return `
Great news, ${orderData.customerName}!
You've earned ${orderData.pointsEarned} points from your recent purchase!
Order Details:
- Order #: ${orderData.orderNumber}
- Points Earned: ${orderData.pointsEarned}
- Total Points: ${orderData.totalPoints}
View your rewards at: https://yourdomain.com/loyalty/rewards
`;
}
}
```
#### 3. Event Tracking
```javascript
class TajoEventTracker {
constructor() {
this.eventsApi = new EventsApi();
}
// Track loyalty events
async trackLoyaltyEvent(customerEmail, eventType, properties = {}) {
const createEvent = {
email: customerEmail,
event: eventType,
properties: {
timestamp: new Date().toISOString(),
platform: 'tajo',
...properties
}
};
try {
const response = await this.eventsApi.createEvent(createEvent);
return response;
} catch (error) {
console.error(`Error tracking event ${eventType}:`, error);
throw error;
}
}
// Specific event tracking methods
async trackPurchase(customerEmail, purchaseData) {
return this.trackLoyaltyEvent(customerEmail, 'Purchase Completed', {
order_id: purchaseData.orderId,
order_total: purchaseData.total,
currency: purchaseData.currency,
items_count: purchaseData.itemsCount,
points_earned: purchaseData.pointsEarned,
loyalty_tier: purchaseData.customerTier,
categories: purchaseData.categories
});
}
async trackPointsRedemption(customerEmail, redemptionData) {
return this.trackLoyaltyEvent(customerEmail, 'Points Redeemed', {
points_used: redemptionData.pointsUsed,
reward_type: redemptionData.rewardType,
reward_value: redemptionData.rewardValue,
remaining_points: redemptionData.remainingPoints,
redemption_method: redemptionData.method
});
}
async trackTierUpgrade(customerEmail, upgradeData) {
return this.trackLoyaltyEvent(customerEmail, 'Tier Upgraded', {
previous_tier: upgradeData.previousTier,
new_tier: upgradeData.newTier,
points_required: upgradeData.pointsRequired,
benefits_unlocked: upgradeData.benefitsUnlocked
});
}
async trackReferral(customerEmail, referralData) {
return this.trackLoyaltyEvent(customerEmail, 'Referral Made', {
referral_method: referralData.method,
referee_email: referralData.refereeEmail,
referral_bonus: referralData.bonus,
referral_code: referralData.code
});
}
}
```
### Advanced Usage
#### 1. Bulk Operations
```javascript
class TajoBulkService {
constructor() {
this.contactsApi = new ContactsApi();
this.batchSize = 50; // Recommended batch size
}
// Bulk customer import
async importCustomers(customers) {
const batches = this.createBatches(customers, this.batchSize);
const results = [];
for (const batch of batches) {
try {
const contacts = batch.map(customer => ({
email: customer.email,
attributes: {
FIRSTNAME: customer.firstName,
LASTNAME: customer.lastName,
LOYALTY_POINTS: customer.points,
LOYALTY_TIER: customer.tier,
TOTAL_SPENT: customer.totalSpent
}
}));
const response = await this.contactsApi.importContacts({
contacts,
listIds: [1], // Default list
updateEnabled: true
});
results.push(response);
} catch (error) {
console.error('Batch import error:', error);
// Continue with other batches
}
}
return results;
}
createBatches(array, batchSize) {
const batches = [];
for (let i = 0; i < array.length; i += batchSize) {
batches.push(array.slice(i, i + batchSize));
}
return batches;
}
}
```
#### 2. Error Handling and Retry Logic
```javascript
class TajoApiClient {
constructor() {
this.maxRetries = 3;
this.retryDelay = 1000; // 1 second
}
async apiCallWithRetry(apiCall, retries = this.maxRetries) {
try {
return await apiCall();
} catch (error) {
if (retries > 0 && this.isRetryableError(error)) {
console.log(`Retrying API call. Attempts remaining: ${retries - 1}`);
await this.delay(this.retryDelay);
return this.apiCallWithRetry(apiCall, retries - 1);
}
throw error;
}
}
isRetryableError(error) {
// Retry on rate limits, server errors, and network issues
return error.status >= 500 || error.status === 429 || error.code === 'NETWORK_ERROR';
}
delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
```
#### 3. Webhook Handling
```javascript
import express from 'express';
import crypto from 'crypto';
const app = express();
// Webhook endpoint for Brevo events
app.post('/webhooks/brevo', express.raw({type: 'application/json'}), (req, res) => {
const signature = req.headers['x-brevo-signature'];
const payload = req.body;
// Verify webhook signature
if (!verifyWebhookSignature(payload, signature)) {
return res.status(401).json({ error: 'Invalid signature' });
}
const event = JSON.parse(payload);
switch (event.event) {
case 'delivered':
handleEmailDelivered(event);
break;
case 'opened':
handleEmailOpened(event);
break;
case 'clicked':
handleEmailClicked(event);
break;
case 'bounced':
handleEmailBounced(event);
break;
default:
console.log('Unhandled event type:', event.event);
}
res.status(200).json({ success: true });
});
function verifyWebhookSignature(payload, signature) {
const expectedSignature = crypto
.createHmac('sha256', process.env.TAJO_WEBHOOK_SECRET)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature, 'hex'),
Buffer.from(expectedSignature, 'hex')
);
}
async function handleEmailOpened(event) {
// Update customer engagement score
const customerEmail = event.email;
const campaignType = event.tags?.includes('loyalty') ? 'loyalty' : 'general';
// Track engagement in your system
await updateCustomerEngagement(customerEmail, 'email_opened', {
campaign_type: campaignType,
subject: event.subject,
timestamp: event.ts
});
}
```
### Testing
#### Unit Tests
```javascript
import { jest } from '@jest/globals';
import { TajoCustomerService } from '../src/customer-service.js';
describe('TajoCustomerService', () => {
let customerService;
let mockContactsApi;
beforeEach(() => {
mockContactsApi = {
createContact: jest.fn(),
updateContact: jest.fn(),
getContactInfo: jest.fn()
};
customerService = new TajoCustomerService();
customerService.contactsApi = mockContactsApi;
});
test('should create customer successfully', async () => {
const customerData = {
email: 'test@example.com',
firstName: 'John',
lastName: 'Doe',
loyaltyId: 'LYL-001',
tier: 'Bronze'
};
mockContactsApi.createContact.mockResolvedValue({ id: 123 });
const result = await customerService.createCustomer(customerData);
expect(mockContactsApi.createContact).toHaveBeenCalledWith({
email: 'test@example.com',
attributes: expect.objectContaining({
FIRSTNAME: 'John',
LASTNAME: 'Doe',
LOYALTY_ID: 'LYL-001',
LOYALTY_TIER: 'Bronze'
}),
listIds: [1],
updateEnabled: true
});
expect(result.id).toBe(123);
});
});
```
#### Integration Tests
```javascript
describe('Brevo Integration Tests', () => {
let customerService;
beforeAll(() => {
customerService = new TajoCustomerService();
});
test('should sync customer to Brevo', async () => {
const testCustomer = {
email: `test-${Date.now()}@example.com`,
firstName: 'Test',
lastName: 'User',
loyaltyId: `LYL-${Date.now()}`,
tier: 'Bronze',
points: 100
};
// Create customer
const createResult = await customerService.createCustomer(testCustomer);
expect(createResult.id).toBeDefined();
// Verify customer exists
const retrievedCustomer = await customerService.getCustomer(testCustomer.email);
expect(retrievedCustomer.email).toBe(testCustomer.email);
expect(retrievedCustomer.attributes.LOYALTY_POINTS).toBe(100);
// Clean up
await customerService.deleteCustomer(testCustomer.email);
});
});
```
### Performance Optimization
#### Caching
```javascript
import Redis from 'ioredis';
class TajoCachedService extends TajoCustomerService {
constructor() {
super();
this.redis = new Redis(process.env.REDIS_URL);
this.cacheTTL = 300; // 5 minutes
}
async getCustomer(email) {
const cacheKey = `customer:${email}`;
// Try cache first
const cached = await this.redis.get(cacheKey);
if (cached) {
return JSON.parse(cached);
}
// Fetch from API
const customer = await super.getCustomer(email);
// Cache result
if (customer) {
await this.redis.setex(cacheKey, this.cacheTTL, JSON.stringify(customer));
}
return customer;
}
}
```
#### Rate Limiting
```javascript
import { RateLimiter } from 'limiter';
class TajoRateLimitedService extends TajoCustomerService {
constructor() {
super();
// Brevo general tier: 10 requests per second across /v3/contacts
this.limiter = new RateLimiter({
tokensPerInterval: 10,
interval: 'second'
});
}
async makeApiCall(apiCall) {
await this.limiter.removeTokens(1);
return apiCall();
}
async createCustomer(customerData) {
return this.makeApiCall(() => super.createCustomer(customerData));
}
}
```
### Next Steps
- **[Platform Integration Guide](/docs/platform-integration/tajo-brevo-integration)** - Complete setup guide
- **[Webhook Configuration](/docs/webhook-configuration/setup-guide)** - Set up real-time events
- **Python SDK** - Alternative language SDK
- **[API Reference](/docs/messaging-api/)** - Full API documentation
### Frequently asked questions
**How do I install the official Brevo JavaScript SDK, and does it work in the browser?**
It works in Node.js applications and browser environments. Install it with npm install @getbrevo/brevo, yarn add @getbrevo/brevo or pnpm add @getbrevo/brevo, then set your API key on the SDK's apiKey configuration from an environment variable such as BREVO_API_KEY.
**Which environment variables does a Brevo SDK integration use?**
BREVO_API_KEY for the key, optionally BREVO_API_URL, which defaults to https://api.brevo.com/v3, and a webhook secret for verifying incoming webhook signatures.
**How do I create or update a contact with the Brevo JavaScript SDK?**
Call createContact with the email, an attributes object such as FIRSTNAME, LASTNAME, PHONE, SIGNUP_DATE and TOTAL_SPENT, listIds and updateEnabled set to true so an existing contact is updated; call updateContact with the email and changed attributes to modify one.
**How do I verify a Brevo webhook in Node.js?**
Read the raw request body with express.raw, compute an HMAC-SHA256 hex digest with your webhook secret, compare it in constant time with the signature header, then dispatch on event.event such as delivered, opened, clicked or bounced and reply 200.
**How do I test code that uses the Brevo SDK?**
Mock the SDK API classes in unit tests, for example a contactsApi with jest.fn createContact, updateContact and getContactInfo, and assert the payload. Keep integration tests against a real account with disposable test emails.
---
## JavaScript SDK
Source: https://tajo.io/docs/sdks-libraries/javascript/
Official JavaScript/Node.js SDK for the Brevo API
The official Brevo JavaScript SDK provides a simple way to integrate Brevo services into your Node.js applications.
### Installation
```bash
npm install @getbrevo/brevo
# or
yarn add @getbrevo/brevo
```
### Quick Start
```javascript
const brevo = require('@getbrevo/brevo');
// Configure API key
let apiInstance = new brevo.TransactionalEmailsApi();
apiInstance.setApiKey(brevo.TransactionalEmailsApiApiKeys.apiKey, 'YOUR_API_KEY');
// Send transactional email
let sendSmtpEmail = new brevo.SendSmtpEmail();
sendSmtpEmail.subject = "Hello from Brevo";
sendSmtpEmail.htmlContent = "
Hello World
";
sendSmtpEmail.sender = { "name": "Your App", "email": "noreply@yourapp.com" };
sendSmtpEmail.to = [{ "email": "user@example.com", "name": "John Doe" }];
apiInstance.sendTransacEmail(sendSmtpEmail).then(
data => console.log('Email sent successfully:', data),
error => console.error('Error:', error)
);
```
### Configuration
#### Environment Variables
```javascript
// .env file
BREVO_API_KEY=your_api_key_here
// Configuration
const brevo = require('@getbrevo/brevo');
const apiInstance = new brevo.TransactionalEmailsApi();
apiInstance.setApiKey(
brevo.TransactionalEmailsApiApiKeys.apiKey,
process.env.BREVO_API_KEY
);
```
### Available APIs
#### Transactional Emails
```javascript
const emailApi = new brevo.TransactionalEmailsApi();
const smsApi = new brevo.TransactionalSMSApi();
const contactsApi = new brevo.ContactsApi();
const campaignsApi = new brevo.EmailCampaignsApi();
const accountApi = new brevo.AccountApi();
```
### Examples
#### Send Email with Template
```javascript
const sendTemplateEmail = async (templateId, recipientEmail, templateData) => {
let sendSmtpEmail = new brevo.SendSmtpEmail();
sendSmtpEmail.templateId = templateId;
sendSmtpEmail.to = [{ email: recipientEmail }];
sendSmtpEmail.params = templateData;
try {
const result = await emailApi.sendTransacEmail(sendSmtpEmail);
return result;
} catch (error) {
console.error('Failed to send email:', error);
throw error;
}
};
```
#### Create Contact
```javascript
const createContact = async (email, firstName, lastName) => {
let createContactData = new brevo.CreateContact();
createContactData.email = email;
createContactData.attributes = {
FIRSTNAME: firstName,
LASTNAME: lastName
};
try {
const result = await contactsApi.createContact(createContactData);
return result;
} catch (error) {
console.error('Failed to create contact:', error);
throw error;
}
};
```
### Error Handling
```javascript
const handleBrevoError = (error) => {
if (error.response) {
// API error response
console.log('Status:', error.response.status);
console.log('Data:', error.response.body);
} else {
// Network or other error
console.log('Error:', error.message);
}
};
// Usage
try {
await emailApi.sendTransacEmail(sendSmtpEmail);
} catch (error) {
handleBrevoError(error);
}
```
### Frequently asked questions
**How do I install the Brevo JavaScript SDK?**
Run npm install @getbrevo/brevo or yarn add @getbrevo/brevo, then require it with const brevo = require('@getbrevo/brevo').
**How do I set my API key in the Brevo Node.js SDK?**
Create an API instance such as new brevo.TransactionalEmailsApi() and call setApiKey(brevo.TransactionalEmailsApiApiKeys.apiKey, process.env.BREVO_API_KEY), keeping the key in an environment variable rather than in code.
**How do I send a transactional email with the Brevo JavaScript SDK?**
Build a new brevo.SendSmtpEmail with subject, htmlContent, sender and to, then call apiInstance.sendTransacEmail(sendSmtpEmail), which returns a promise. To use a template instead, set templateId and params.
**Which API classes does the Brevo JavaScript SDK expose?**
TransactionalEmailsApi, TransactionalSMSApi, ContactsApi, EmailCampaignsApi and AccountApi, each created with new brevo.().
**How do I create a contact with the Brevo JavaScript SDK?**
Build a new brevo.CreateContact with the email and an attributes object such as FIRSTNAME and LASTNAME, then call contactsApi.createContact(createContactData) inside a try block.
**How do I handle errors from the Brevo SDK?**
Wrap calls in try and catch. An API error carries error.response with status and body; a network or other error only has error.message.
---
## App Analytics
Source: https://tajo.io/docs/stripe-apps/analytics/
Track installs, views, conversion rates, and custom metrics for your Stripe App
Stripe provides built-in analytics for published marketplace apps, giving you visibility into installs, listing performance, and user engagement. You can also build custom analytics using webhooks and the Stripe API.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Available Reports
The Stripe Dashboard provides the following analytics for your published app:
#### Install Metrics
| Metric | Description |
|--------|-------------|
| **Installs** | Total number of new app installations in the selected period |
| **Uninstalls** | Total number of app uninstallations in the selected period |
| **Cumulative Net Installs** | Running total of installs minus uninstalls over time |
#### Listing Performance
| Metric | Description |
|--------|-------------|
| **Listing Views** | Total page views of your app's marketplace listing |
| **Unique Views** | Unique visitors who viewed your marketplace listing |
| **MoM Conversion Rate** | Month-over-month percentage of listing viewers who install the app |
#### Growth Metrics
| Metric | Description |
|--------|-------------|
| **MoM Growth Rate** | Month-over-month growth in net installs |
| **Churn Rate** | Percentage of installed users who uninstall per month |
### Data Freshness
Analytics data has a **48-hour lag**. The data you see in the dashboard reflects activity from approximately two days ago. Plan your reporting windows accordingly.
- Data is updated daily with a 48-hour processing delay
- Historical data is available from the date your app was first published
- Metrics are calculated in UTC timezone
- Export data as CSV from the Stripe Dashboard for external analysis
### Accessing Analytics via API
You can programmatically access app analytics using the Stripe Reporting API:
#### Install Data
```bash
# Fetch app install report
curl https://api.stripe.com/v1/reporting/report_runs \
-u sk_live_xxxxx: \
-d "report_type=app.installs.daily" \
-d "parameters[interval_start]=1709251200" \
-d "parameters[interval_end]=1711929600" \
-d "parameters[app_id]=com.tajo.brevo-integration"
```
#### Listing Views
```bash
# Fetch listing views report
curl https://api.stripe.com/v1/reporting/report_runs \
-u sk_live_xxxxx: \
-d "report_type=app.listing_views.daily" \
-d "parameters[interval_start]=1709251200" \
-d "parameters[interval_end]=1711929600" \
-d "parameters[app_id]=com.tajo.brevo-integration"
```
#### Programmatic Access (Node.js)
```javascript
const stripe = require('stripe')('sk_live_xxxxx');
// Create a report run for app installs
const reportRun = await stripe.reporting.reportRuns.create({
report_type: 'app.installs.daily',
parameters: {
interval_start: Math.floor(new Date('2025-03-01').getTime() / 1000),
interval_end: Math.floor(new Date('2025-03-31').getTime() / 1000),
app_id: 'com.tajo.brevo-integration',
},
});
// Poll for report completion
const checkReport = async (reportId) => {
const report = await stripe.reporting.reportRuns.retrieve(reportId);
if (report.status === 'succeeded') {
// Download the report file
const file = await stripe.files.retrieve(report.result.id);
console.log('Report URL:', file.url);
return file;
}
if (report.status === 'failed') {
throw new Error('Report generation failed');
}
// Report still processing
return null;
};
```
### Users Tab
The Users tab in your app's analytics shows individual account-level data:
| Column | Description |
|--------|-------------|
| **Account ID** | The Stripe account that installed your app |
| **Install Date** | When the app was installed |
| **Status** | Active or uninstalled |
| **Uninstall Date** | When the app was uninstalled (if applicable) |
Use this data to:
- Track individual account activation status
- Follow up with accounts that installed but haven't completed onboarding
- Identify accounts that uninstalled and understand churn reasons
- Correlate install data with your own platform analytics
### Custom Analytics with Webhooks
For real-time analytics and deeper insights, set up webhooks to track app events:
#### Webhook Events
Listen for these events to build custom analytics:
| Event | Description |
|-------|-------------|
| `account.application.authorized` | User installed your app |
| `account.application.deauthorized` | User uninstalled your app |
#### Webhook Handler
```javascript
const express = require('express');
const stripe = require('stripe')('sk_live_xxxxx');
const app = express();
app.post('/webhooks/stripe-app', express.raw({ type: 'application/json' }), async (req, res) => {
const sig = req.headers['stripe-signature'];
const webhookSecret = process.env.STRIPE_APP_WEBHOOK_SECRET;
let event;
try {
event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret);
} catch (err) {
console.error('Webhook signature verification failed:', err.message);
return res.status(400).send('Webhook signature verification failed');
}
switch (event.type) {
case 'account.application.authorized': {
const account = event.data.object;
console.log('App installed by:', account.id);
// Track in your analytics system
await trackEvent('app_installed', {
account_id: account.id,
timestamp: new Date(event.created * 1000),
});
// Trigger onboarding email
await sendOnboardingEmail(account.id);
break;
}
case 'account.application.deauthorized': {
const account = event.data.object;
console.log('App uninstalled by:', account.id);
// Track churn
await trackEvent('app_uninstalled', {
account_id: account.id,
timestamp: new Date(event.created * 1000),
});
// Clean up account data
await cleanupAccountData(account.id);
break;
}
default:
console.log('Unhandled event type:', event.type);
}
res.json({ received: true });
});
```
#### Connect List API
For Connect platforms, use the Connect List API to get information about accounts with your app installed:
```javascript
const stripe = require('stripe')('sk_live_xxxxx');
// List all connected accounts with your app installed
const getInstalledAccounts = async () => {
const accounts = [];
let hasMore = true;
let startingAfter = null;
while (hasMore) {
const params = { limit: 100 };
if (startingAfter) {
params.starting_after = startingAfter;
}
const response = await stripe.accounts.list(params);
for (const account of response.data) {
// Check if your app is installed on this account
if (account.settings?.apps?.includes('com.tajo.brevo-integration')) {
accounts.push({
id: account.id,
email: account.email,
created: account.created,
});
}
}
hasMore = response.has_more;
if (response.data.length > 0) {
startingAfter = response.data[response.data.length - 1].id;
}
}
return accounts;
};
```
### Building a Custom Analytics Dashboard
Combine Stripe analytics with your own data for a comprehensive view:
```javascript
// Aggregate analytics for reporting
const getAppAnalytics = async (startDate, endDate) => {
const [stripeInstalls, brevoSyncStats, activationData] = await Promise.all([
// Stripe install data
getStripeInstallReport(startDate, endDate),
// Brevo sync metrics from Tajo
getBrevoSyncMetrics(startDate, endDate),
// Activation funnel from your database
getActivationFunnel(startDate, endDate),
]);
return {
// Acquisition
totalInstalls: stripeInstalls.installs,
totalUninstalls: stripeInstalls.uninstalls,
netInstalls: stripeInstalls.installs - stripeInstalls.uninstalls,
listingConversionRate: stripeInstalls.conversionRate,
// Activation
onboardingCompleted: activationData.completedOnboarding,
brevoConnected: activationData.connectedBrevo,
firstSyncCompleted: activationData.firstSyncCompleted,
activationRate: activationData.completedOnboarding / stripeInstalls.installs,
// Engagement
totalCustomersSynced: brevoSyncStats.totalCustomers,
totalEventsSynced: brevoSyncStats.totalEvents,
averageSyncFrequency: brevoSyncStats.avgSyncPerDay,
// Retention
churnRate: stripeInstalls.uninstalls / stripeInstalls.totalActive,
monthlyGrowthRate: stripeInstalls.momGrowth,
};
};
```
### Key Metrics to Track
For the Tajo Brevo integration, focus on these metrics:
| Metric | Target | Why It Matters |
|--------|--------|---------------|
| **Install-to-Activation Rate** | > 70% | Percentage of installers who complete Brevo setup |
| **Time to First Sync** | < 5 minutes | How quickly users see value after installing |
| **30-Day Retention** | > 80% | Percentage of users still active after 30 days |
| **Monthly Churn Rate** | < 5% | Keep uninstalls low with a valuable integration |
| **Listing Conversion Rate** | > 15% | Percentage of listing viewers who install |
| **Customers Synced per Account** | > 100 | Indicates depth of integration usage |
Set up automated alerts for significant metric changes. A sudden spike in uninstalls or drop in activation rate may indicate a bug or UX issue that needs immediate attention.
### Frequently asked questions
**What install metrics and analytics does Stripe show for a marketplace app?**
Installs, uninstalls and cumulative net installs; listing views, unique views and month-over-month conversion rate; month-over-month growth and churn rate; plus a Users tab with each account's install date and status. Data lags by 48 hours, is calculated in UTC and can be exported as CSV.
**How do I track Stripe App installs in real time?**
Listen for the webhooks account.application.authorized, which fires when a user installs the app, and account.application.deauthorized, which fires on uninstall, verifying each event with stripe.webhooks.constructEvent and your webhook secret.
**Which metrics should a Stripe to Brevo integration watch?**
Install-to-activation rate above 70 percent, time to first sync under 5 minutes, 30-day retention above 80 percent, monthly churn under 5 percent, listing conversion above 15 percent, and more than 100 customers synced per account. The Tajo Stripe app itself is still planned.
---
## App Manifest Reference
Source: https://tajo.io/docs/stripe-apps/app-manifest/
Complete schema reference for the stripe-app.json manifest file used to configure Stripe Apps
The `stripe-app.json` manifest file is the central configuration for your Stripe App. It declares your app's identity, permissions, UI views, security policies, and post-install behavior.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Full Manifest Example
```json
{
"id": "com.tajo.brevo-integration",
"version": "1.2.0",
"name": "Tajo for Brevo",
"icon": "./assets/icon.png",
"distribution_type": "public",
"sandbox_install_compatible": true,
"stripe_api_access_type": "oauth",
"allowed_redirect_uris": [
"https://tajo.io/stripe/callback",
"https://tajo.io/stripe/oauth/complete"
],
"permissions": [
{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
},
{
"permission": "customer_write",
"purpose": "Update customer metadata with Brevo sync status"
},
{
"permission": "charge_read",
"purpose": "Access payment history for Brevo event tracking"
},
{
"permission": "product_read",
"purpose": "Sync product catalog to Brevo for personalized campaigns"
},
{
"permission": "event_read",
"purpose": "Subscribe to real-time events for Brevo automation triggers"
},
{
"permission": "invoice_read",
"purpose": "Track invoice lifecycle events in Brevo"
}
],
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.customer.list",
"component": "CustomerListView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
},
{
"viewport": "stripe.dashboard.drawer.default",
"component": "DrawerView"
},
{
"viewport": "stripe.dashboard.settings",
"component": "SettingsView"
},
{
"viewport": "stripe.dashboard.onboarding",
"component": "OnboardingView"
}
],
"content_security_policy": {
"connect-src": [
"https://api.example.com",
"https://api.brevo.com"
],
"image-src": [
"https://cdn.example.com",
"https://assets.brevo.com"
],
"purpose": "Connect to Tajo API for data sync and Brevo API for contact management"
}
},
"post_install_action": {
"type": "onboarding"
},
"constants": {
"API_BASE_URL": "https://api.example.com/v1",
"SYNC_INTERVAL_SECONDS": "300"
}
}
```
### Schema Reference
#### Top-Level Fields
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `id` | string | Yes | Unique app identifier in reverse domain notation (slug format) |
| `version` | string | Yes | Semantic version string (e.g., `"1.2.0"`) |
| `name` | string | Yes | Display name shown in the marketplace (max 35 characters) |
| `icon` | string | Yes | Relative path to the app icon file (300x300 PNG or SVG) |
| `distribution_type` | string | Yes | `"public"` for marketplace or `"private"` for internal use |
| `sandbox_install_compatible` | boolean | No | Whether the app can be installed in sandbox/test mode |
| `stripe_api_access_type` | string | No | API access method: `"oauth"` or `"api_key"` |
| `allowed_redirect_uris` | string[] | No | Allowed OAuth redirect URIs for install flow |
| `permissions` | PermissionRequest[] | Yes | Array of permission requests |
| `ui_extension` | UIExtensionManifest | No | UI extension configuration |
| `post_install_action` | PostInstallAction | No | Action to take after app installation |
| `constants` | object | No | Key-value pairs accessible in the app at runtime |
#### id
The app identifier is a slug-format string, typically in reverse domain notation:
```json
"id": "com.tajo.brevo-integration"
```
- Must be globally unique across all Stripe Apps
- Use lowercase letters, numbers, hyphens, and dots only
- Cannot be changed after the app is created
- Determines the app's URL on the marketplace
#### version
Follows semantic versioning:
```json
"version": "1.2.0"
```
- **MAJOR**: Breaking changes or significant feature additions
- **MINOR**: New features, backward compatible
- **PATCH**: Bug fixes and minor improvements
- Must be incremented for each upload
#### distribution_type
Controls who can install your app:
| Value | Description |
|-------|-------------|
| `"public"` | Available on the Stripe App Marketplace to all users |
| `"private"` | Only installable by your own Stripe account |
#### stripe_api_access_type
Determines how your app authenticates with the Stripe API:
| Value | Description |
|-------|-------------|
| `"oauth"` | Uses OAuth 2.0 flow for authentication (recommended for public apps) |
| `"api_key"` | Uses restricted API keys (suitable for private apps) |
### PermissionRequest
Each permission request declares a specific Stripe API permission your app needs:
```json
{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `permission` | string | Yes | The permission identifier (see [Permissions Reference](/docs/stripe-apps/permissions)) |
| `purpose` | string | Yes | Human-readable explanation of why this permission is needed |
**Purpose guidelines:**
- Write clear, specific explanations that merchants can understand
- Explain what the permission is used for, not just what it grants
- Keep descriptions concise (one sentence)
- Avoid technical jargon
### UIExtensionManifest
Configures the UI components of your app:
```json
{
"ui_extension": {
"views": [...],
"content_security_policy": {...}
}
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `views` | ViewManifest[] | Yes | Array of view declarations |
| `content_security_policy` | CSPRequest | No | Content Security Policy for external resources |
### ViewManifest
Each view maps a React component to a Stripe Dashboard viewport:
```json
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `viewport` | string | Yes | The Dashboard location where this view renders (see [Viewports Reference](/docs/stripe-apps/viewports)) |
| `component` | string | Yes | Name of the React component to render (must match the exported component name) |
A single app can declare multiple views for different viewports:
```json
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.payment.detail",
"component": "PaymentDetailView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
}
]
```
### CSPRequest
The Content Security Policy controls which external domains your app can connect to:
```json
{
"content_security_policy": {
"connect-src": [
"https://api.example.com",
"https://api.brevo.com"
],
"image-src": [
"https://cdn.example.com"
],
"purpose": "Connect to Tajo API for data sync and load images from CDN"
}
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `connect-src` | string[] | No | Domains the app can make network requests to |
| `image-src` | string[] | No | Domains the app can load images from |
| `purpose` | string | Yes | Explanation of why these external connections are needed |
Only include domains that your app actually needs to connect to. Excessive CSP entries may trigger additional review scrutiny.
### PostInstallAction
Configures what happens immediately after a user installs your app:
```json
{
"post_install_action": {
"type": "onboarding"
}
}
```
| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `type` | string | Yes | The action type (see below) |
| `url` | string | Conditional | URL for `external` type actions |
#### Action Types
| Type | Behavior |
|------|----------|
| `"onboarding"` | Opens the app's onboarding view in the Dashboard |
| `"settings"` | Opens the app's settings view in the Dashboard |
| `"external"` | Redirects the user to an external URL (requires `url` field) |
Examples:
```json
// Open onboarding flow
{
"post_install_action": {
"type": "onboarding"
}
}
// Open settings page
{
"post_install_action": {
"type": "settings"
}
}
// Redirect to external setup
{
"post_install_action": {
"type": "external",
"url": "https://app.tajo.io/stripe/setup"
}
}
```
See the [Post-Install Actions guide](/docs/stripe-apps/post-install) for detailed implementation patterns.
### Constants
Define static key-value pairs accessible at runtime in your app:
```json
{
"constants": {
"API_BASE_URL": "https://api.example.com/v1",
"SYNC_INTERVAL_SECONDS": "300",
"MAX_BATCH_SIZE": "100"
}
}
```
- All values must be strings
- Constants are embedded in the app at build time
- Use constants for configuration that varies between environments
- **Never** store secrets or API keys as constants, use the Secret Store API instead
Access constants in your app code:
```typescript
import { constants } from '@stripe/ui-extension-sdk/constants';
const apiUrl = constants.API_BASE_URL;
```
### Extended Manifest for Development
During local development, additional fields are available:
```json
{
"id": "com.tajo.brevo-integration",
"version": "0.1.0",
"name": "Tajo for Brevo (Dev)",
"icon": "./assets/icon-dev.png",
"distribution_type": "private",
"sandbox_install_compatible": true,
"dev": {
"hot_reload": true,
"port": 4242
}
}
```
The `dev` section is stripped during production builds and app uploads. Use it for local development convenience settings only.
### Validation
Validate your manifest before uploading:
```bash
# Validate manifest syntax and schema
stripe apps validate
# Check for common issues
stripe apps check
```
Common validation errors:
| Error | Cause | Fix |
|-------|-------|-----|
| `Invalid permission` | Unknown permission identifier | Check the [Permissions Reference](/docs/stripe-apps/permissions) |
| `Invalid viewport` | Unknown viewport identifier | Check the [Viewports Reference](/docs/stripe-apps/viewports) |
| `Missing purpose` | Permission without purpose field | Add a purpose string to each permission |
| `Invalid version` | Non-semver version string | Use format `MAJOR.MINOR.PATCH` |
| `Icon not found` | Icon path doesn't resolve | Verify the icon file exists at the specified path |
### Frequently asked questions
**What is the stripe-app.json manifest, and what is the maximum length of an app name?**
The central configuration of a Stripe App. Required fields are id in reverse domain notation, a semantic version, a name of at most 35 characters, an icon of 300 by 300 pixels, distribution_type public or private, and permissions. Optional fields cover ui_extension views, allowed_redirect_uris, post_install_action and constants. The Tajo Stripe app is still planned.
**What is the difference between public and private Stripe App distribution?**
distribution_type public lists the app on the Stripe App Marketplace for all users; private makes it installable only by your own Stripe account. Public apps should use stripe_api_access_type oauth, private apps can use api_key.
**How do I declare a permission in a Stripe App manifest?**
Each entry in permissions has a permission identifier and a purpose: one clear, jargon-free sentence explaining what the app uses it for. A permission without a purpose fails validation.
**Can I store API keys in Stripe App manifest constants?**
No. Constants are string key-value pairs embedded at build time for configuration that varies between environments; never put secrets or API keys there. Use the Secret Store API instead.
**How do I validate a Stripe App manifest?**
Run stripe apps validate and stripe apps check before uploading. Common errors are an unknown permission or viewport identifier, a permission missing its purpose, a non-semver version, and an icon path that does not resolve.
---
## Embedded Stripe Apps
Source: https://tajo.io/docs/stripe-apps/embedded-apps/
Use Connect embedded components to integrate Stripe Apps into your own platform
Embedded Stripe Apps allow platforms built on Stripe Connect to surface third-party app functionality directly within their own dashboards. Using Connect embedded components, you can give your connected accounts access to apps like QuickBooks, Xero, and Mailchimp without them needing to visit the Stripe Dashboard.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Overview
Embedded apps use two key Connect embedded components:
- **`app-install`**: Renders an install button for a Stripe App within your platform UI
- **`app-viewport`**: Renders a specific app viewport within your platform UI
This enables platform operators to embed accounting, marketing, and operational tools directly in their product.
### Supported Apps
The following apps support embedding via Connect components:
| App | Category | Use Case |
|-----|----------|----------|
| **QuickBooks** | Accounting | Sync payments and invoices to QuickBooks |
| **Xero** | Accounting | Automated bookkeeping and reconciliation |
| **Mailchimp** | Marketing | Sync customer data for email campaigns |
| **Custom Apps** | Any | Your own Stripe Apps built for your platform |
The Tajo Brevo integration can be embedded in Connect platforms, allowing connected accounts to sync their Stripe data to Brevo through the platform's own interface.
### Setup with Account Sessions API
To embed apps, you need to create Account Sessions with the appropriate components enabled:
#### Server-Side: Create Account Session
```javascript
const stripe = require('stripe')('sk_live_...');
// Create an Account Session for the connected account
const accountSession = await stripe.accountSessions.create({
account: 'acct_connected_account_id',
components: {
// Enable app install component
app_install: {
enabled: true,
features: {
allowed_apps: [
'com.tajo.brevo-integration',
'com.quickbooks.stripe-app'
],
},
},
// Enable app viewport component
app_viewport: {
enabled: true,
features: {
allowed_apps: [
'com.tajo.brevo-integration'
],
},
},
},
});
// Return the client secret to your frontend
res.json({ clientSecret: accountSession.client_secret });
```
#### Client-Side: Initialize Connect.js
```javascript
import { loadConnectAndInitialize } from '@stripe/connect-js';
// Initialize Connect.js with the account session
const stripeConnect = loadConnectAndInitialize({
publishableKey: 'pk_live_...',
fetchClientSecret: async () => {
const response = await fetch('/api/account-session', {
method: 'POST',
});
const { clientSecret } = await response.json();
return clientSecret;
},
});
```
### App Install Component
The `app-install` component renders an install button that connected accounts can use to install a Stripe App:
#### JavaScript
```javascript
// Create the app install element
const appInstall = stripeConnect.create('app-install');
// Set the app to install
appInstall.setApp('com.tajo.brevo-integration');
// Mount to a DOM element
const container = document.getElementById('app-install-container');
appInstall.mount(container);
// Listen for install events
appInstall.on('app_installed', (event) => {
console.log('App installed:', event.app_id);
// Show the app viewport after installation
showAppViewport();
});
appInstall.on('app_uninstalled', (event) => {
console.log('App uninstalled:', event.app_id);
});
```
#### React
```tsx
import {
ConnectAppInstall,
ConnectComponentsProvider,
} from '@stripe/react-connect-js';
const AppInstallButton = () => {
return (
{
console.log('App installed:', event.app_id);
}}
onAppUninstalled={(event) => {
console.log('App uninstalled:', event.app_id);
}}
/>
);
};
```
### App Viewport Component
The `app-viewport` component renders a specific app viewport within your platform:
#### JavaScript
```javascript
// Create the app viewport element
const appViewport = stripeConnect.create('app-viewport');
// Configure the viewport
appViewport.setApp('com.tajo.brevo-integration');
appViewport.setViewport('stripe.dashboard.customer.detail');
// Pass object context (e.g., customer ID)
appViewport.setObjectContext({
id: 'cus_xxxxx',
object: 'customer',
});
// Mount to a DOM element
const container = document.getElementById('app-viewport-container');
appViewport.mount(container);
```
#### React
```tsx
import {
ConnectAppViewport,
ConnectComponentsProvider,
} from '@stripe/react-connect-js';
const BrevoCustomerView = ({ customerId }: { customerId: string }) => {
return (
);
};
```
### Destination Charge Metadata Schema
When using embedded apps with destination charges (common in Connect platforms), the charge metadata carries structured data that accounting and marketing integrations can consume.
#### Accounting Integrations
For apps like QuickBooks and Xero, destination charge metadata follows this schema:
```json
{
"metadata": {
"customer_id": "cus_platform_customer_id",
"customer_email": "customer@example.com",
"product_name": "Premium Subscription",
"product_id": "prod_xxxxx",
"quantity": "1",
"unit_amount": "4999",
"currency": "usd",
"platform_fee": "500",
"platform_fee_currency": "usd",
"tax_amount": "450",
"tax_rate_id": "txr_xxxxx",
"invoice_id": "inv_xxxxx",
"order_id": "order_12345"
}
}
```
| Field | Type | Description |
|-------|------|-------------|
| `customer_id` | string | Platform's customer identifier |
| `customer_email` | string | Customer email for invoice/receipt matching |
| `product_name` | string | Product display name for line items |
| `product_id` | string | Stripe product ID |
| `quantity` | string | Item quantity |
| `unit_amount` | string | Unit price in smallest currency unit (cents) |
| `currency` | string | Three-letter ISO currency code |
| `platform_fee` | string | Application fee amount in smallest currency unit |
| `platform_fee_currency` | string | Currency for the platform fee |
| `tax_amount` | string | Tax amount in smallest currency unit |
| `tax_rate_id` | string | Stripe tax rate ID applied |
| `invoice_id` | string | Associated invoice ID |
| `order_id` | string | Platform's internal order identifier |
#### Marketing Integrations
For apps like Mailchimp and the Tajo Brevo integration, the metadata enables customer segmentation and campaign targeting:
```json
{
"metadata": {
"customer_id": "cus_xxxxx",
"customer_email": "customer@example.com",
"customer_name": "Jane Smith",
"product_category": "subscription",
"product_name": "Pro Plan",
"purchase_value": "4999",
"currency": "usd",
"is_first_purchase": "true",
"referral_source": "partner_campaign",
"subscription_interval": "monthly",
"lifetime_value": "29994"
}
}
```
This metadata enables Brevo automations such as:
- **Welcome series** for first-time buyers (`is_first_purchase: "true"`)
- **Upsell campaigns** based on `product_category` and `purchase_value`
- **Retention flows** for subscription customers based on `subscription_interval`
- **Win-back campaigns** targeting high `lifetime_value` customers who churn
### Platform Integration Example
A complete platform integration embedding the Tajo Brevo app:
```tsx
import { useState, useEffect } from 'react';
import {
ConnectAppInstall,
ConnectAppViewport,
ConnectComponentsProvider,
} from '@stripe/react-connect-js';
import { loadConnectAndInitialize } from '@stripe/connect-js';
const TajoBrevoPlatformIntegration = ({ connectedAccountId, customerId }) => {
const [stripeConnect, setStripeConnect] = useState(null);
const [isInstalled, setIsInstalled] = useState(false);
useEffect(() => {
const instance = loadConnectAndInitialize({
publishableKey: 'pk_live_...',
fetchClientSecret: async () => {
const res = await fetch('/api/account-session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ accountId: connectedAccountId }),
});
const { clientSecret } = await res.json();
return clientSecret;
},
});
setStripeConnect(instance);
}, [connectedAccountId]);
if (!stripeConnect) return
Loading...
;
return (
{!isInstalled ? (
Connect Brevo via Tajo
Install the Tajo integration to sync customer data with Brevo.
setIsInstalled(true)}
/>
) : (
Brevo Customer Profile
)}
);
};
```
### Security Considerations
When embedding apps in your platform:
- **Account Sessions expire**: Create new sessions as needed; do not cache client secrets
- **Scope control**: Use `allowed_apps` to restrict which apps can be installed
- **Data isolation**: Each connected account's data is isolated; the platform cannot access app data
- **CSP headers**: Ensure your platform's Content Security Policy allows connections to `https://connect-js.stripe.com`
Embedded app components require a Connect integration with Account Sessions API access. Standard Stripe accounts cannot use embedded components.
### Frequently asked questions
**What is an embedded Stripe App, and which Connect embedded components does it use?**
A Stripe App surfaced inside a Connect platform's own dashboard through two Connect embedded components: app-install, which renders an install button, and app-viewport, which renders a specific app view. It requires a Connect integration with Account Sessions; standard Stripe accounts cannot use embedded components.
**How do I enable embedded apps for a connected account?**
Create an Account Session server-side for the connected account with the app_install and app_viewport components enabled and an allowed_apps list, return its client_secret, then initialize Connect.js in the browser with your publishable key and a fetchClientSecret callback.
**What metadata should destination charges carry for marketing integrations?**
Fields that drive segmentation and campaigns: customer id and email, product name, id and category, purchase value, whether it is a first purchase, subscription interval and lifetime value. They enable welcome series, upsell, retention and win-back automations in Brevo. The Tajo app itself is still planned.
**What should I watch for when embedding Stripe Apps?**
Account Sessions expire, so never cache client secrets; restrict installable apps with allowed_apps; each connected account's app data is isolated from the platform; and your Content Security Policy must allow connections to https://connect-js.stripe.com.
---
## Stripe Apps Integration Guide
Source: https://tajo.io/docs/stripe-apps/
Status: planned. This section is a build guide. There is no Tajo app in the Stripe App Marketplace today.
Stripe Apps let you embed custom functionality directly into the Stripe Dashboard. This section is a **build guide**: it documents how such an app for the Tajo–Brevo integration would be built, tested, and published.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace today, and the app identifiers, URLs, and credentials in these pages are illustrative placeholders, not live endpoints. To connect Stripe to Tajo right now, use the [Stripe connector](/docs/connectors/stripe/) (restricted API key, read-only sync).
The goal is to publish a **Brevo integration** on the Stripe App Marketplace, enabling Stripe merchants to sync customer data, orders, and events directly into Brevo for marketing automation and CRM.
### What Are Stripe Apps?
Stripe Apps extend the Stripe Dashboard with custom UI components and backend integrations. They allow third-party developers to:
- Add custom views to Stripe Dashboard pages (customers, payments, invoices, etc.)
- Access Stripe data through scoped permissions
- Sync data between Stripe and external platforms like Brevo
- Provide onboarding and configuration flows within the Dashboard
### Tajo + Brevo Integration Goals
The Tajo Stripe App connects Stripe with Brevo to deliver:
- **Customer Intelligence**: Sync Stripe customer profiles, payment history, and lifetime value into Brevo contacts
- **Event Tracking**: Push Stripe events (payments, subscriptions, refunds) as Brevo transactional events
- **Automated Campaigns**: Trigger Brevo email, SMS, and WhatsApp campaigns based on Stripe activity
- **Loyalty Programs**: Build retention workflows using Stripe purchase data synced to Brevo
### Architecture Overview
### Guide Contents
This documentation covers the complete lifecycle of building and publishing a Stripe App:
#### Getting Started
| Guide | Description |
|-------|-------------|
| [Publishing to Marketplace](/docs/stripe-apps/publish-app) | Requirements and steps to submit your app for review |
| [App Review Requirements](/docs/stripe-apps/review-requirements) | Quality, security, and UX standards for approval |
#### Configuration & Reference
| Guide | Description |
|-------|-------------|
| [App Manifest Reference](/docs/stripe-apps/app-manifest) | Complete schema for the `stripe-app.json` manifest file |
| [Permissions Reference](/docs/stripe-apps/permissions) | Full list of Stripe API permissions and how to request them |
| [Viewports Reference](/docs/stripe-apps/viewports) | Dashboard locations where your app UI can appear |
#### Features & Integration
| Guide | Description |
|-------|-------------|
| [Embedded Stripe Apps](/docs/stripe-apps/embedded-apps) | Using Connect embedded components for platform integrations |
| [Install Links & Deep Links](/docs/stripe-apps/install-links) | Generate install URLs and deep link into specific app views |
| [Post-Install Actions](/docs/stripe-apps/post-install) | Configure onboarding flows after app installation |
#### Operations & Growth
| Guide | Description |
|-------|-------------|
| [App Analytics](/docs/stripe-apps/analytics) | Track installs, views, and conversion metrics |
### Prerequisites
Before building a Stripe App, ensure you have:
1. **Stripe Account**: An activated Stripe account (not restricted to test mode)
2. **Stripe CLI**: Install the Stripe CLI for local development and app uploads
3. **Node.js**: Version 16 or later for the app UI extension
4. **Tajo Platform Access**: Active Tajo account with Brevo API credentials configured
### Quick Start
```bash
# Install Stripe CLI
brew install stripe/stripe-cli/stripe
# Login to your Stripe account
stripe login
# Create a new Stripe App project
stripe apps create tajo-brevo-integration
# Start local development
stripe apps start
```
### Key Concepts
#### App Manifest
Every Stripe App has a `stripe-app.json` manifest that declares permissions, viewports, and configuration. See the [App Manifest Reference](/docs/stripe-apps/app-manifest) for the full schema.
#### UI Extensions
Stripe Apps can render React-based UI components in specific Dashboard viewports. The UI toolkit provides pre-built components that match the Stripe Dashboard design system.
#### Permissions
Apps must declare the specific Stripe API resources they need access to. Users approve these permissions during installation. See the [Permissions Reference](/docs/stripe-apps/permissions).
#### Signing Secret
Each app receives a signing secret for verifying install signatures and securing communication between your backend and Stripe.
### Development Workflow
1. **Define** your manifest with required permissions and viewports
2. **Build** the UI extension using Stripe's React component library
3. **Implement** backend endpoints for data sync with Brevo via Tajo
4. **Test** locally using `stripe apps start`
5. **Upload** with `stripe apps upload`
6. **Submit** for review through the Stripe Dashboard
7. **Publish** and monitor via analytics
Stripe requires apps to be written in English for marketplace distribution. Your app listing, UI text, and documentation must all be in English.
### Next Steps
Start with the [Publishing Guide](/docs/stripe-apps/publish-app) to understand the full requirements, then work through the technical references to configure your app manifest and permissions.
### Frequently asked questions
**Is there a Tajo app in the Stripe App Marketplace?**
No. The Stripe Apps section is a build guide with status planned: there is no Tajo app in the Stripe App Marketplace today, and the app identifiers, URLs and credentials in these pages are illustrative placeholders, not live endpoints. To connect Stripe today, use the Stripe and Brevo integration guide.
**What would the Tajo Stripe app do?**
The goal is a Brevo integration on the Stripe App Marketplace: sync Stripe customer profiles, payment history and lifetime value into Brevo contacts, push payments, subscriptions and refunds as Brevo events, and trigger Brevo email, SMS and WhatsApp campaigns from Stripe activity.
**What are Stripe Apps?**
Extensions that embed custom UI and backend integrations in the Stripe Dashboard: custom views on customer, payment and invoice pages, scoped access to Stripe data, sync with external platforms such as Brevo, and onboarding flows inside the Dashboard.
**What do I need to build a Stripe App?**
An activated Stripe account, the Stripe CLI, Node.js 16 or later, and a Tajo account with Brevo credentials. The workflow is define the stripe-app.json manifest, build the React UI extension, implement the backend, test with stripe apps start, upload with stripe apps upload, then submit for review. Listings must be in English.
---
## Install Links & Deep Links
Source: https://tajo.io/docs/stripe-apps/install-links/
Generate install URLs for app distribution and deep links to navigate users to specific app views
Install links let you distribute your Stripe App outside the marketplace, while deep links navigate users directly to specific views within your installed app. Both are essential for smooth onboarding and integration flows.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Install Links
Install links provide a direct URL that merchants can use to install your app. When a user clicks an install link, Stripe handles the installation flow and then redirects back to your specified URI.
#### Prerequisites
Before using install links, configure `allowed_redirect_uris` in your app manifest:
```json
{
"id": "com.tajo.brevo-integration",
"allowed_redirect_uris": [
"https://tajo.io/stripe/callback",
"https://tajo.io/stripe/oauth/complete"
]
}
```
#### Install Link Format
```
https://marketplace.stripe.com/oauth/v2/authorize?client_id=APP_ID&redirect_uri=REDIRECT_URI&state=STATE_VALUE
```
| Parameter | Required | Description |
|-----------|----------|-------------|
| `client_id` | Yes | Your app ID (e.g., `com.tajo.brevo-integration`) |
| `redirect_uri` | Yes | Must match one of your `allowed_redirect_uris` |
| `state` | Recommended | Random string for CSRF protection |
#### Redirect Parameters
After a successful installation, Stripe redirects the user to your `redirect_uri` with these query parameters:
| Parameter | Description |
|-----------|-------------|
| `user_id` | The Stripe user ID of the installing account |
| `account_id` | The Stripe account ID (e.g., `acct_xxxxx`) |
| `state` | The `state` value you provided (for CSRF verification) |
| `install_signature` | HMAC signature to verify the install is legitimate |
Example redirect URL:
```
https://tajo.io/stripe/callback
?user_id=usr_xxxxx
&account_id=acct_xxxxx
&state=abc123random
&install_signature=sig_xxxxx
```
#### CSRF Protection
Always use the `state` parameter to prevent cross-site request forgery attacks:
```javascript
import crypto from 'crypto';
// Generate a random state value and store it in the session
const generateInstallLink = (req, res) => {
const state = crypto.randomBytes(32).toString('hex');
// Store state in session for later verification
req.session.stripeInstallState = state;
const installUrl = new URL('https://marketplace.stripe.com/oauth/v2/authorize');
installUrl.searchParams.set('client_id', 'com.tajo.brevo-integration');
installUrl.searchParams.set('redirect_uri', 'https://tajo.io/stripe/callback');
installUrl.searchParams.set('state', state);
res.redirect(installUrl.toString());
};
// Handle the redirect callback
const handleInstallCallback = async (req, res) => {
const { state, user_id, account_id, install_signature } = req.query;
// Verify state matches what we stored
if (state !== req.session.stripeInstallState) {
return res.status(403).json({ error: 'Invalid state parameter' });
}
// Clear the stored state
delete req.session.stripeInstallState;
// Verify the install signature
if (!verifyInstallSignature(install_signature, account_id)) {
return res.status(403).json({ error: 'Invalid install signature' });
}
// Process the successful installation
await processInstallation(user_id, account_id);
res.redirect('/dashboard/stripe-connected');
};
```
#### Signature Verification
Verify the `install_signature` using your app's signing secret:
```javascript
import crypto from 'crypto';
const verifyInstallSignature = (signature, accountId) => {
const signingSecret = process.env.STRIPE_APP_SIGNING_SECRET;
const expectedSignature = crypto
.createHmac('sha256', signingSecret)
.update(accountId)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expectedSignature)
);
};
```
Always use `crypto.timingSafeEqual` for signature comparison to prevent timing attacks. Never use simple string equality (`===`).
#### Signing Secret
Your app's signing secret is available in the Stripe Dashboard under your app's settings. Use it to:
- Verify install signatures from redirect callbacks
- Validate webhook payloads from Stripe
- Authenticate requests between your backend and Stripe
Store the signing secret securely:
```bash
# Set as environment variable
export STRIPE_APP_SIGNING_SECRET="whsec_xxxxx"
```
Never hardcode signing secrets in your source code or commit them to version control.
### Deep Links
Deep links navigate users directly to a specific view within your installed Stripe App. Use them to direct users from external communications (emails, notifications, support pages) to the relevant app context.
#### Deep Link URL Format
```
https://dashboard.stripe.com/MODE/acct_ID/PAGE?apps[APP_ID][TARGET]=VIEWPORT_ID
```
| Component | Description | Example |
|-----------|-------------|---------|
| `MODE` | `live` or `test` | `live` |
| `acct_ID` | Target Stripe account ID | `acct_1234567890` |
| `PAGE` | Dashboard page path | `customers/cus_xxxxx` |
| `APP_ID` | Your app's ID | `com.tajo.brevo-integration` |
| `TARGET` | `drawer` or `modal` | `drawer` |
| `VIEWPORT_ID` | The viewport to open | `stripe.dashboard.customer.detail` |
#### Drawer vs Modal Targets
| Target | Behavior | Use Case |
|--------|----------|----------|
| `drawer` | Opens the app in the side panel (drawer) | Default app interaction, context alongside the page |
| `modal` | Opens the app in a full-screen modal overlay | Focused workflows, onboarding, complex forms |
#### Deep Link Examples
##### Open customer detail view in drawer
```
https://dashboard.stripe.com/live/acct_xxxxx/customers/cus_xxxxx
?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.customer.detail
```
##### Open settings in modal
```
https://dashboard.stripe.com/live/acct_xxxxx/settings
?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.settings
```
##### Open onboarding flow
```
https://dashboard.stripe.com/live/acct_xxxxx/dashboard
?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.onboarding
```
##### Open payment detail view in test mode
```
https://dashboard.stripe.com/test/acct_xxxxx/payments/pi_xxxxx
?apps[com.tajo.brevo-integration][drawer]=stripe.dashboard.payment.detail
```
#### Generating Deep Links Programmatically
```javascript
const generateDeepLink = ({
accountId,
mode = 'live',
page,
appId = 'com.tajo.brevo-integration',
target = 'drawer',
viewport,
}) => {
const baseUrl = `https://dashboard.stripe.com/${mode}/${accountId}/${page}`;
const params = new URLSearchParams();
params.set(`apps[${appId}][${target}]`, viewport);
return `${baseUrl}?${params.toString()}`;
};
// Generate a link to view a customer's Brevo profile
const customerLink = generateDeepLink({
accountId: 'acct_xxxxx',
page: 'customers/cus_xxxxx',
viewport: 'stripe.dashboard.customer.detail',
});
// Generate a link to app settings
const settingsLink = generateDeepLink({
accountId: 'acct_xxxxx',
page: 'settings',
viewport: 'stripe.dashboard.settings',
target: 'modal',
});
```
#### Using Deep Links in Communications
Deep links are particularly useful in:
- **Email notifications**: "View Brevo sync status for this customer"
- **Support responses**: "Click here to check your integration settings"
- **Onboarding emails**: "Complete your Brevo setup"
- **Error alerts**: "Review the sync issue for customer X"
```html
View Brevo Profile in Stripe
```
### Combining Install Links and Deep Links
For the best onboarding experience, combine install links with post-install deep links:
1. User clicks an **install link** from your website or email
2. User installs the app and is redirected to your callback URL
3. Your callback processes the installation and redirects the user to a **deep link** that opens the onboarding viewport
```javascript
const handleInstallCallback = async (req, res) => {
const { account_id, install_signature, state } = req.query;
// Verify state and signature
// ... (verification code)
// Process installation
await processInstallation(account_id);
// Redirect to the app's onboarding view via deep link
const onboardingLink = generateDeepLink({
accountId: account_id,
page: 'dashboard',
viewport: 'stripe.dashboard.onboarding',
target: 'modal',
});
res.redirect(onboardingLink);
};
```
Always test install links and deep links in both live and test mode to ensure they work correctly in all environments.
### Frequently asked questions
**How does a Stripe App install link work?**
A URL of the form https://marketplace.stripe.com/oauth/v2/authorize with client_id set to the app id, a redirect_uri that matches the manifest's allowed_redirect_uris, and a random state for CSRF protection. Stripe runs the install flow, then redirects back with user_id, account_id, state and install_signature. No Tajo Stripe app exists yet; the ids are placeholders.
**How do I verify a Stripe App install signature, and why use the state parameter?**
Compute an HMAC-SHA256 hex digest of the account id with your app's signing secret from the Stripe Dashboard and compare it to install_signature with crypto.timingSafeEqual, never plain string equality. Also check the returned state matches the one you stored in the session.
**What is a Stripe App deep link?**
A Dashboard URL that opens a specific view of your installed app: https://dashboard.stripe.com/MODE/acct_ID/PAGE with a query parameter apps[APP_ID][TARGET]=VIEWPORT_ID, where MODE is live or test, TARGET is drawer for the side panel or modal for a full-screen overlay, and VIEWPORT_ID names the view.
**How should install links and deep links work together?**
A user clicks the install link, installs the app and lands on your callback, which verifies the signature and state and then redirects to a deep link that opens the onboarding viewport as a modal. Test both in live and test mode.
---
## Permissions Reference
Source: https://tajo.io/docs/stripe-apps/permissions/
Complete reference of Stripe API permissions available for Stripe Apps
Stripe Apps use a permission system to control access to Stripe API resources. Each permission must be explicitly declared in your app manifest with a clear purpose statement. Users approve these permissions when they install your app.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Managing Permissions
#### Declaring Permissions
Add permissions to your `stripe-app.json` manifest:
```json
{
"permissions": [
{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
},
{
"permission": "customer_write",
"purpose": "Update customer metadata with Brevo sync status"
}
]
}
```
#### Granting Permissions via CLI
During development, you can grant permissions using the Stripe CLI:
```bash
# Grant a specific permission
stripe apps grant permission "customer_read" \
--purpose "Read customer profiles to sync with Brevo contacts"
# Grant multiple permissions
stripe apps grant permission "charge_read" \
--purpose "Access payment data for event tracking"
stripe apps grant permission "event_read" \
--purpose "Subscribe to real-time Stripe events"
```
#### Permission Best Practices
- **Minimum necessary**: Only request permissions your app actually uses
- **Clear purposes**: Write purpose statements that non-technical users can understand
- **Justify read+write**: If you need both read and write, explain why in each purpose
- **Review regularly**: Remove permissions that are no longer needed when updating your app
Requesting excessive permissions is one of the most common reasons for app rejection. Only request what you need.
### Permissions by Product
#### Core
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Account** | `account_read` | Read account details and settings |
| **Account** | `account_write` | Update account settings |
| **Balance** | `balance_read` | View account balance and transactions |
| **Customer** | `customer_read` | Read customer profiles, metadata, and payment methods |
| **Customer** | `customer_write` | Create, update, or delete customer records |
| **Event** | `event_read` | Read and subscribe to account events |
| **File** | `file_read` | Read uploaded files and file links |
| **File** | `file_write` | Upload files and create file links |
| **Mandate** | `mandate_read` | Read payment mandates |
| **Product** | `product_read` | Read product catalog and pricing |
| **Product** | `product_write` | Create, update, or delete products and prices |
| **Token** | `token_read` | Read tokenized payment data |
| **Webhook Endpoint** | `webhook_endpoint_read` | Read webhook endpoint configurations |
| **Webhook Endpoint** | `webhook_endpoint_write` | Create, update, or delete webhook endpoints |
#### Payments
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Charge** | `charge_read` | Read payment charges and refunds |
| **Charge** | `charge_write` | Create charges, capture payments, issue refunds |
| **Dispute** | `dispute_read` | Read payment disputes and evidence |
| **Dispute** | `dispute_write` | Submit dispute evidence and respond to disputes |
| **Payment Intent** | `payment_intent_read` | Read payment intent details and status |
| **Payment Intent** | `payment_intent_write` | Create, confirm, or cancel payment intents |
| **Payment Method** | `payment_method_read` | Read saved payment methods |
| **Payment Method** | `payment_method_write` | Attach or detach payment methods from customers |
| **Payout** | `payout_read` | Read payout details and schedules |
| **Payout** | `payout_write` | Create or cancel payouts |
| **Refund** | `refund_read` | Read refund details |
| **Refund** | `refund_write` | Create or update refunds |
| **Setup Intent** | `setup_intent_read` | Read setup intent details |
| **Setup Intent** | `setup_intent_write` | Create or confirm setup intents |
#### Billing
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Coupon** | `coupon_read` | Read discount coupons and promotion codes |
| **Coupon** | `coupon_write` | Create, update, or delete coupons |
| **Credit Note** | `credit_note_read` | Read credit notes |
| **Credit Note** | `credit_note_write` | Create or void credit notes |
| **Invoice** | `invoice_read` | Read invoice details, line items, and status |
| **Invoice** | `invoice_write` | Create, update, finalize, or void invoices |
| **Invoice Item** | `invoice_item_read` | Read pending invoice items |
| **Invoice Item** | `invoice_item_write` | Create or delete invoice items |
| **Plan** | `plan_read` | Read subscription plans and pricing |
| **Plan** | `plan_write` | Create, update, or delete plans |
| **Price** | `price_read` | Read price configurations |
| **Price** | `price_write` | Create or update prices |
| **Quote** | `quote_read` | Read price quotes |
| **Quote** | `quote_write` | Create, finalize, or accept quotes |
| **Subscription** | `subscription_read` | Read subscription details, schedules, and status |
| **Subscription** | `subscription_write` | Create, update, or cancel subscriptions |
| **Subscription Schedule** | `subscription_schedule_read` | Read subscription schedules |
| **Subscription Schedule** | `subscription_schedule_write` | Create, update, or release subscription schedules |
| **Usage Record** | `usage_record_read` | Read metered billing usage records |
| **Usage Record** | `usage_record_write` | Create usage records for metered billing |
#### Checkout
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Checkout Session** | `checkout_session_read` | Read Checkout Session details and line items |
| **Checkout Session** | `checkout_session_write` | Create or expire Checkout Sessions |
| **Payment Link** | `payment_link_read` | Read Payment Link configurations |
| **Payment Link** | `payment_link_write` | Create or update Payment Links |
#### Connect
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Application Fee** | `application_fee_read` | Read application fee details |
| **Connected Account** | `connected_account_read` | Read connected account details |
| **Connected Account** | `connected_account_write` | Create or update connected accounts |
| **Transfer** | `transfer_read` | Read transfer details between accounts |
| **Transfer** | `transfer_write` | Create transfers to connected accounts |
| **Top-up** | `topup_read` | Read top-up details |
| **Top-up** | `topup_write` | Create top-ups to Stripe balance |
#### Issuing
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Issuing Card** | `issuing_card_read` | Read issued card details |
| **Issuing Card** | `issuing_card_write` | Create, update, or deactivate issued cards |
| **Issuing Cardholder** | `issuing_cardholder_read` | Read cardholder information |
| **Issuing Cardholder** | `issuing_cardholder_write` | Create or update cardholders |
| **Issuing Transaction** | `issuing_transaction_read` | Read card transaction details |
| **Issuing Authorization** | `issuing_authorization_read` | Read authorization requests |
| **Issuing Authorization** | `issuing_authorization_write` | Approve or decline authorization requests |
| **Issuing Dispute** | `issuing_dispute_read` | Read issuing disputes |
| **Issuing Dispute** | `issuing_dispute_write` | Create or submit issuing disputes |
#### Reporting
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Report Run** | `report_run_read` | Read report run results |
| **Report Run** | `report_run_write` | Create new report runs |
| **Report Type** | `report_type_read` | Read available report types |
#### Tax
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Tax Calculation** | `tax_calculation_read` | Read tax calculation results |
| **Tax Calculation** | `tax_calculation_write` | Create tax calculations |
| **Tax Rate** | `tax_rate_read` | Read tax rate configurations |
| **Tax Rate** | `tax_rate_write` | Create or update tax rates |
| **Tax Registration** | `tax_registration_read` | Read tax registration details |
#### Terminal
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Terminal Reader** | `terminal_reader_read` | Read terminal reader details |
| **Terminal Reader** | `terminal_reader_write` | Register or update terminal readers |
| **Terminal Location** | `terminal_location_read` | Read terminal location details |
| **Terminal Location** | `terminal_location_write` | Create or update terminal locations |
#### Secret Store
| Resource | Permission | Description |
|----------|-----------|-------------|
| **Secret** | `secret_read` | Read secrets from the Secret Store |
| **Secret** | `secret_write` | Create, update, or delete secrets |
### Recommended Permissions for Tajo Brevo Integration
For the Tajo Brevo integration app, these are the recommended permissions:
```json
{
"permissions": [
{
"permission": "customer_read",
"purpose": "Sync customer profiles and contact information to Brevo"
},
{
"permission": "customer_write",
"purpose": "Store Brevo contact ID and sync status on customer metadata"
},
{
"permission": "charge_read",
"purpose": "Track purchase events and revenue data for Brevo analytics"
},
{
"permission": "product_read",
"purpose": "Sync product catalog to Brevo for personalized email campaigns"
},
{
"permission": "event_read",
"purpose": "Listen to real-time events to trigger Brevo automation workflows"
},
{
"permission": "invoice_read",
"purpose": "Track invoice events for transactional emails via Brevo"
},
{
"permission": "subscription_read",
"purpose": "Monitor subscription lifecycle for Brevo retention campaigns"
},
{
"permission": "secret_write",
"purpose": "Securely store Brevo API credentials in Stripe Secret Store"
},
{
"permission": "secret_read",
"purpose": "Retrieve stored Brevo API credentials for data sync operations"
},
{
"permission": "webhook_endpoint_write",
"purpose": "Register webhook endpoints for real-time event delivery to Tajo"
}
]
}
```
### Permission Scopes
Permissions can operate at different scopes depending on whether your app is installed on a platform account or a connected account:
| Scope | Description |
|-------|-------------|
| **Account** | Permissions apply to the installing account's own data |
| **Connected Account** | For Connect platforms, permissions can extend to connected accounts |
When requesting write permissions, be prepared to explain during app review exactly how and when your app modifies data. Unnecessary write permissions are a common reason for rejection.
### Frequently asked questions
**How do Stripe App permissions work, and why do apps get rejected for them?**
Every Stripe API resource the app touches must be declared in the manifest with a permission identifier such as customer_read and a purpose statement users can understand. Users approve the permissions at install. Requesting more than you use is one of the most common reasons for rejection.
**Which permissions would a Stripe to Brevo integration need?**
Read permissions on the data it syncs: customer_read for customer profiles, charge_read for payment data and event_read to subscribe to Stripe events, each with a purpose such as reading customer profiles to sync with Brevo contacts. The Tajo Stripe app is still planned.
**How do I grant a permission to a Stripe App during development?**
Use the Stripe CLI: stripe apps grant permission with the identifier and a --purpose string, for example customer_read with the purpose of syncing customer profiles to Brevo contacts.
**What are the permission naming conventions for Stripe Apps?**
Resource plus access level, for example customer_read and customer_write, charge_read, subscription_read, invoice_read, event_read, webhook_endpoint_write or secret_read, grouped by product: core, payments, billing, checkout, Connect, Issuing, reporting, tax, Terminal and the Secret Store.
---
## Post-Install Actions & Onboarding
Source: https://tajo.io/docs/stripe-apps/post-install/
Configure post-installation behavior and build effective onboarding flows for your Stripe App
Post-install actions determine what happens immediately after a user installs your Stripe App. A well-designed post-install experience guides users through setup and increases activation rates.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Post-Install Action Types
Stripe supports four post-install action types, each configured in your app manifest:
#### 1. Link to App (Default)
Opens the app in the default drawer viewport. This is the default behavior if no `post_install_action` is specified:
```json
{
"post_install_action": {
"type": "default"
}
}
```
The user sees the app's `drawer.default` viewport in the Stripe Dashboard sidebar.
#### 2. Link to Onboarding
Opens the app's dedicated onboarding view, providing a focused setup experience:
```json
{
"post_install_action": {
"type": "onboarding"
}
}
```
This requires an `onboarding` viewport declared in your manifest:
```json
{
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.onboarding",
"component": "OnboardingView"
}
]
},
"post_install_action": {
"type": "onboarding"
}
}
```
#### 3. Link to Settings
Opens the app's settings view, useful when the app requires API keys or configuration before use:
```json
{
"post_install_action": {
"type": "settings"
}
}
```
This requires a `settings` viewport:
```json
{
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.settings",
"component": "SettingsView"
}
]
},
"post_install_action": {
"type": "settings"
}
}
```
#### 4. Link to External URL
Redirects the user to an external URL for setup. Use this when your onboarding flow lives outside the Stripe Dashboard:
```json
{
"post_install_action": {
"type": "external",
"url": "https://app.tajo.io/stripe/setup"
}
}
```
External URLs must use HTTPS and should be listed in your `allowed_redirect_uris`. The Stripe review team will verify that the external URL provides a functional setup experience.
### Onboarding Best Practices
#### Make It Effortless
Minimize the number of steps required to get started:
- **Pre-fill information** available from the Stripe account context
- **Use sensible defaults** for configuration options
- **Allow skipping** optional steps with a clear path to complete them later
- **Show progress** with step indicators for multi-step flows
#### Make It Customizable
Let users configure the integration to their needs:
- **Data mapping options**, let users choose which Stripe fields sync to Brevo
- **Sync frequency**, offer real-time, hourly, or daily sync options
- **Selective sync**, let users choose which customers or products to sync
- **Notification preferences**, configure alerts for sync errors or important events
#### Make It Relevant
Show value immediately:
- **Preview synced data** before enabling the integration
- **Show what will happen** when the user completes setup
- **Provide a test sync** option to verify the connection works
- **Display success metrics** after the initial sync completes
### OnboardingView Component
The `OnboardingView` component renders in a focused modal when the user installs the app:
```typescript
import {
Box,
Button,
Inline,
Icon,
Banner,
TextField,
Select,
Divider,
} from '@stripe/ui-extension-sdk/ui';
import type { ExtensionContextValue } from '@stripe/ui-extension-sdk/context';
import { useState } from 'react';
const OnboardingView = ({ environment, userContext }: ExtensionContextValue) => {
const [step, setStep] = useState(1);
const [brevoApiKey, setBrevoApiKey] = useState('');
const [syncMode, setSyncMode] = useState('realtime');
const [isConnecting, setIsConnecting] = useState(false);
const [error, setError] = useState(null);
const totalSteps = 3;
const handleConnect = async () => {
setIsConnecting(true);
setError(null);
try {
// Store the API key securely
await storeBrevoApiKey(brevoApiKey);
// Verify the connection
const result = await verifyBrevoConnection(brevoApiKey);
if (result.success) {
setStep(2);
} else {
setError('Unable to connect to Brevo. Please check your API key.');
}
} catch (err) {
setError('Connection failed. Please try again.');
} finally {
setIsConnecting(false);
}
};
return (
{/* Progress indicator */}
Step {step} of {totalSteps}
{error && (
{error}
)}
{step === 1 && (
Connect Your Brevo Account
Enter your Brevo API key to start syncing customer data.
setBrevoApiKey(e.target.value)}
css={{ marginTop: 'medium' }}
/>
Find your API key in Brevo under Settings > SMTP & API > API Keys
)}
{step === 2 && (
Configure Sync Settings
)}
{step === 3 && (
Your Brevo account is connected. Tajo will begin syncing
customer data automatically.
What happens next:
Existing Stripe customers will sync to Brevo contacts
New customers and events will sync in real-time
View sync status on any customer's detail page
)}
);
};
export default OnboardingView;
```
### Sign-In Flow with SignInView
If your app requires users to sign in to an external account (like Tajo), use a dedicated sign-in view:
```typescript
import {
Box,
Button,
Inline,
TextField,
Banner,
Link,
} from '@stripe/ui-extension-sdk/ui';
import { useState } from 'react';
const SignInView = ({ onSignInComplete }) => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const handleSignIn = async () => {
setIsLoading(true);
setError(null);
try {
const response = await fetch('https://api.example.com/v1/auth/stripe-app', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email, password }),
});
if (!response.ok) {
throw new Error('Invalid credentials');
}
const { token } = await response.json();
// Store the auth token securely in Stripe's Secret Store
await storeAuthToken(token);
onSignInComplete();
} catch (err) {
setError('Sign-in failed. Please check your credentials and try again.');
} finally {
setIsLoading(false);
}
};
return (
Sign in to Tajo
Connect your Tajo account to enable Brevo sync.
{error && (
{error}
)}
setEmail(e.target.value)}
css={{ marginTop: 'medium' }}
/>
setPassword(e.target.value)}
css={{ marginTop: 'small' }}
/>
Don't have a Tajo account? Sign up
);
};
```
### Deep Link Launch with Query Parameters
You can launch specific onboarding steps or pre-fill data using query parameters in deep links:
```typescript
import type { ExtensionContextValue } from '@stripe/ui-extension-sdk/context';
const OnboardingView = ({ environment }: ExtensionContextValue) => {
// Access query parameters from the deep link
const { queryParams } = environment;
// Pre-fill step from query parameter
const initialStep = queryParams?.step ? parseInt(queryParams.step) : 1;
// Pre-fill API key from query parameter (e.g., from Tajo dashboard)
const prefilledApiKey = queryParams?.brevo_key || '';
// Source tracking for analytics
const installSource = queryParams?.source || 'marketplace';
const [step, setStep] = useState(initialStep);
const [brevoApiKey, setBrevoApiKey] = useState(prefilledApiKey);
// ... rest of onboarding logic
};
```
Generate deep links that pre-fill onboarding data:
```javascript
// From your Tajo dashboard, generate a link that pre-fills the Brevo API key
const onboardingLink = [
'https://dashboard.stripe.com/live/acct_xxxxx/dashboard',
'?apps[com.tajo.brevo-integration][modal]=stripe.dashboard.onboarding',
'&apps[com.tajo.brevo-integration][queryParams][step]=1',
'&apps[com.tajo.brevo-integration][queryParams][source]=tajo_dashboard',
].join('');
```
### Handling Returning Users
When a user opens your app after completing onboarding, detect their state and show the appropriate view:
```typescript
const MainView = ({ environment, userContext }: ExtensionContextValue) => {
const [authState, setAuthState] = useState<'loading' | 'signed-out' | 'onboarding' | 'ready'>('loading');
useEffect(() => {
checkUserState().then((state) => {
setAuthState(state);
});
}, []);
switch (authState) {
case 'loading':
return ;
case 'signed-out':
return setAuthState('onboarding')} />;
case 'onboarding':
return setAuthState('ready')} />;
case 'ready':
return ;
}
};
```
Store onboarding completion status in the Stripe Secret Store so you can detect returning users without an external API call.
### Frequently asked questions
**What post-install action types does Stripe support?**
The manifest's post_install_action decides: link to the app's default drawer view, which is the default; link to a dedicated onboarding viewport; link to a settings viewport when the app needs API keys first; or redirect to an external HTTPS URL listed in allowed_redirect_uris. The Tajo Stripe app is still planned.
**Can a Stripe App redirect users to an external setup page after install, and when should it?**
Onboarding when the user must connect another account before the app is useful, settings when it only needs configuration, and an external URL when the setup flow lives outside the Stripe Dashboard. Stripe's review team checks that an external URL provides a working setup.
**What makes a good Stripe App onboarding flow?**
The fewest steps to a first result, clear progress, sensible defaults, and a visible way to finish later. Each extra step before the user sees value costs activations.
---
## Publishing to Stripe App Marketplace
Source: https://tajo.io/docs/stripe-apps/publish-app/
Step-by-step guide to preparing, submitting, and publishing your Stripe App to the marketplace
Publishing your Stripe App to the marketplace makes it available to all Stripe users. This guide covers the requirements, preparation steps, and submission process.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Prerequisites
Before you can publish an app to the Stripe App Marketplace, you must meet these requirements:
- **Activated Stripe account**: Your account cannot be restricted to test mode only
- **One app per account**: Each Stripe account can only publish one public app to the marketplace
- **English only**: All app content, UI text, and listing information must be in English
- **Completed app**: Your app must be fully functional and tested
If you need to publish multiple apps, you must create separate Stripe accounts for each one.
### Publishing Steps
#### Step 1: Update Your Manifest
Set the `distribution_type` in your `stripe-app.json` to `public`:
```json
{
"id": "com.tajo.brevo-integration",
"version": "1.0.0",
"name": "Tajo Brevo Integration",
"icon": "./icon.png",
"distribution_type": "public",
"permissions": [
{
"permission": "customer_read",
"purpose": "Sync customer data to Brevo contacts"
},
{
"permission": "customer_write",
"purpose": "Update customer metadata with Brevo sync status"
},
{
"permission": "event_read",
"purpose": "Track payment and subscription events for Brevo automation"
}
]
}
```
#### Step 2: Prepare Your App
Ensure your app meets all [review requirements](/docs/stripe-apps/review-requirements) before submitting:
1. Test thoroughly in both live and sandbox modes
2. Verify all permissions are necessary and documented
3. Confirm error handling and loading states are implemented
4. Check that all UI text is in English
#### Step 3: Upload Your App
Use the Stripe CLI to upload your app:
```bash
# Upload your app to Stripe
stripe apps upload
# Verify the upload
stripe apps versions list
```
#### Step 4: Write Your Listing
Navigate to the Stripe Dashboard to complete your app listing. All listing fields are required for marketplace submission.
#### Step 5: Submit for Review
After completing your listing, submit the app for review through the Stripe Dashboard. The Stripe team will evaluate your app against the [quality requirements](/docs/stripe-apps/review-requirements).
#### Step 6: Publish
Once approved, you can publish your app to make it available on the marketplace.
### Manifest Setup for Public Distribution
The manifest must include `distribution_type: "public"` and declare all required permissions with clear purpose descriptions:
```json
{
"id": "com.tajo.brevo-integration",
"version": "1.2.0",
"name": "Tajo for Brevo",
"icon": "./assets/icon.png",
"distribution_type": "public",
"stripe_api_access_type": "oauth",
"allowed_redirect_uris": [
"https://tajo.io/stripe/callback"
],
"permissions": [
{
"permission": "customer_read",
"purpose": "Read customer profiles to sync with Brevo contacts"
},
{
"permission": "customer_write",
"purpose": "Write sync metadata to customer records"
},
{
"permission": "charge_read",
"purpose": "Access payment data for Brevo event tracking"
},
{
"permission": "event_read",
"purpose": "Subscribe to Stripe events for real-time Brevo sync"
},
{
"permission": "product_read",
"purpose": "Sync product catalog to Brevo for campaign personalization"
},
{
"permission": "invoice_read",
"purpose": "Track invoice events for Brevo transactional emails"
}
],
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
}
]
},
"post_install_action": {
"type": "onboarding"
}
}
```
Upload the configured app with:
```bash
stripe apps upload
```
### Listing Requirements
Your app listing must include all of the following fields:
| Field | Requirements | Details |
|-------|-------------|---------|
| **Name** | Max 35 characters | The display name shown on the marketplace |
| **Icon** | 300x300 pixels, PNG or SVG | Square icon, no rounded corners (Stripe adds them) |
| **Built by** | Company or developer name | Displayed below the app name |
| **Category** | Select from Stripe's categories | Choose the most relevant category for your app |
| **Subtitle** | Max 80 characters | Brief tagline shown in search results |
| **About** | Max 1,000 characters | Detailed description of what your app does |
| **Key Features** | Up to 5, with images | Highlight main features with screenshots or diagrams |
| **Pricing** | Free, paid, or freemium | Clearly state pricing model and any costs |
| **Support** | Contact URL or email | Where users can get help with your app |
| **Privacy Policy** | URL to privacy policy | Required legal document for data handling |
#### Name Guidelines
- Must be unique on the marketplace
- Should clearly identify your app's purpose
- Avoid generic terms that could confuse users
- Example: "Tajo for Brevo" (15 characters)
#### Icon Guidelines
- Dimensions: exactly 300x300 pixels
- Format: PNG or SVG
- Do not add rounded corners, Stripe applies them automatically
- Use a clear, recognizable logo or symbol
- Ensure legibility at small sizes
#### About Section
Write a compelling description that covers:
- What problem your app solves
- Key integration capabilities
- Who the app is designed for
- Any prerequisites or requirements
Example:
> Tajo for Brevo connects your Stripe payment data with Brevo's marketing automation platform. Automatically sync customers, track payment events, and trigger personalized email, SMS, and WhatsApp campaigns based on real-time purchase behavior. Built for ecommerce businesses that want to maximize customer lifetime value through data-driven retention marketing.
#### Key Features
Each key feature entry includes:
- **Title**: Short feature name
- **Description**: One to two sentences explaining the feature
- **Image**: Screenshot or diagram (recommended 1600x900 pixels)
Recommended features for the Tajo Brevo integration:
1. **Real-time Customer Sync**, Automatically sync Stripe customer profiles to Brevo contacts with full purchase history
2. **Event-Driven Automation**, Trigger Brevo workflows from Stripe events like successful payments, subscription changes, and refunds
3. **Product Catalog Sync**, Keep your Brevo product catalog in sync with Stripe for personalized campaign content
4. **Multi-Channel Campaigns**, Use synced data to power targeted email, SMS, and WhatsApp campaigns
5. **Dashboard Insights**, View Brevo engagement metrics directly in the Stripe Dashboard customer view
#### Pricing Information
Clearly communicate your pricing model:
- **Free**: No cost to install or use
- **Paid**: State the price and billing frequency
- **Freemium**: Describe what's included free and what requires payment
- **Usage-based**: Explain the pricing tiers or per-unit costs
### Testing Your App
Before submission, thoroughly test your app:
#### Test in Sandbox Mode
```bash
# Start your app in test mode
stripe apps start --mode test
# Verify sandbox compatibility
stripe apps validate
```
#### Test Credentials Format
When providing test credentials for the review team, use this format:
```
Test Account Credentials
========================
Platform: Tajo
URL: https://app.tajo.io/test
Email: reviewer@test.tajo.io
Password: [secure test password]
Brevo Test API Key: xkeysib-test-xxxxxxxxxxxx
Required Setup Steps:
1. Log in to the Tajo test account
2. Navigate to Settings > Integrations > Brevo
3. The Brevo API key is pre-configured
4. Install the Stripe App from the test link provided
Expected Behavior:
- Customer sync should begin within 60 seconds of installation
- Navigate to any Stripe customer to see Brevo contact data
- Create a test payment to verify event sync to Brevo
```
#### Review Checklist
Before submitting, verify:
- [ ] App works in both live and test modes
- [ ] All permissions have clear purpose descriptions
- [ ] Error states are handled gracefully
- [ ] Loading states are shown for async operations
- [ ] No hardcoded test data in the production build
- [ ] Privacy policy URL is accessible and accurate
- [ ] Support contact information is valid
- [ ] All listing images meet dimension requirements
- [ ] App description accurately reflects functionality
### After Submission
The Stripe review team typically responds within 5-10 business days. They may:
- **Approve** your app for publication
- **Request changes** with specific feedback
- **Reject** the app if it doesn't meet requirements
If changes are requested, address all feedback and resubmit. Each resubmission goes through the full review cycle.
### Updating a Published App
To update an already-published app:
1. Increment the version in `stripe-app.json`
2. Upload the new version: `stripe apps upload`
3. Submit the update for review
4. Once approved, the update is automatically deployed to all users
Minor bug fixes and non-functional changes may receive expedited review. Major feature additions or permission changes require full review.
### Frequently asked questions
**How do I upload and publish a Stripe App, and what are the requirements?**
An activated Stripe account not limited to test mode, only one public app per account, all content and UI text in English, and a fully functional, tested app. Set distribution_type to public, upload with stripe apps upload, complete the listing in the Dashboard and submit for review. The Tajo app is still planned.
**What does a Stripe App Marketplace listing need?**
A name of at most 35 characters, a 300 by 300 PNG or SVG icon without rounded corners, the builder name, a category, a subtitle of at most 80 characters, an About text of at most 1,000 characters, up to 5 key features with images, the pricing model, a support contact and a privacy policy URL.
**How long does Stripe App review take?**
The Stripe review team typically responds within 5 to 10 business days with an approval, a request for changes or a rejection. Each resubmission goes through the full review cycle again.
**How do I update a published Stripe App?**
Increment the version in stripe-app.json, upload the new version with stripe apps upload and submit the update for review. Once approved it deploys automatically to all users.
---
## App Review Quality Requirements
Source: https://tajo.io/docs/stripe-apps/review-requirements/
Quality, security, UX, and legal standards your Stripe App must meet to pass review
Stripe reviews every app submitted to the marketplace against a comprehensive set of quality requirements. Understanding these standards before development saves time and reduces the number of review iterations.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### Overview
The Stripe App review evaluates your app across six key areas:
1. **Transparent Pricing**, Clear communication of costs
2. **App Functionality**, Reliability and completeness
3. **Developer Standards**, Code quality and API usage
4. **UX Quality**, User interface and experience standards
5. **Security**, Data protection and secure practices
6. **Legal Compliance**, Privacy and regulatory requirements
### Transparent Pricing
Your app must clearly communicate all costs to users:
- **Pricing disclosure**: All pricing must be stated upfront in the marketplace listing
- **No hidden fees**: Users must not encounter unexpected charges after installation
- **Trial terms**: If offering a trial, clearly state the duration and what happens after it ends
- **Upgrade flows**: Any upsell or upgrade prompts must be non-intrusive and clearly optional
- **Currency**: Display prices in the user's local currency when possible
Apps that obscure pricing or charge users without clear consent will be rejected immediately.
### Date and Time Formatting
All dates and times displayed in your app must follow Stripe Dashboard conventions:
- Use the user's locale for date formatting when available
- Display times in the user's local timezone
- Use relative timestamps for recent events (e.g., "2 hours ago")
- Use absolute timestamps for older events with full date and time
- Follow ISO 8601 for any API-facing date fields
```typescript
// Good: Use Stripe's date formatting utilities
import { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-aware
const relativeTime = formatRelativeTime(timestamp); // "2 hours ago"
```
### App Settings
If your app requires configuration:
- Provide a dedicated **Settings view** accessible from the app's viewport
- Pre-populate sensible defaults where possible
- Validate all user inputs with clear error messages
- Allow users to update settings without reinstalling the app
- Persist settings across sessions using the Stripe Secret Store API
### Sandbox Support
Your app must work correctly in Stripe's sandbox (test) mode:
- **Test mode compatibility**: All features must function in test mode
- **Test data**: Use realistic test data that demonstrates app functionality
- **No live data in sandbox**: Never expose production data in test mode
- **Graceful handling**: If a feature is unavailable in sandbox, display a clear message explaining why
- Set `sandbox_install_compatible: true` in your manifest
```json
{
"sandbox_install_compatible": true
}
```
### App Functionality
#### Reliability
- The app must not crash or freeze during normal use
- All advertised features must work as described
- Network errors must be handled gracefully with retry options
- The app must remain responsive during background operations
#### Completeness
- No placeholder content, "coming soon" features, or broken links
- All UI elements must be functional, no dead buttons or inactive controls
- Help text and documentation links must resolve to valid pages
- Uninstallation must cleanly remove all app data and webhooks
#### Performance
- UI must render within 3 seconds on a standard connection
- Background sync operations must not block the UI
- Large data sets must use pagination or lazy loading
- Minimize API calls to avoid rate limiting
### Developer Standards
#### API Usage
- Use the latest stable version of the Stripe API
- Follow Stripe API best practices for pagination, error handling, and idempotency
- Do not exceed rate limits, implement exponential backoff for retries
- Use webhooks for event-driven updates instead of polling
#### Code Quality
- No console errors or warnings in production builds
- Remove all debug logging before submission
- Handle all edge cases (empty states, missing data, network failures)
- Follow Stripe's component library patterns for consistent UI
#### Versioning
- Use semantic versioning (MAJOR.MINOR.PATCH)
- Document breaking changes in version updates
- Maintain backward compatibility where possible
### UX Quality
#### Advertising
- **No ads**: Your app must not display advertisements of any kind
- **No cross-promotion**: Do not promote other products or services within the app UI
- **Branded content**: Only display your own brand identity, not third-party brands (except integration partners like Brevo)
#### Language and Content
- **Consistent language**: Use consistent terminology throughout the app
- **Professional tone**: Match the Stripe Dashboard's professional, concise communication style
- **No jargon**: Avoid technical jargon that merchants may not understand
- **Spell check**: Ensure all text is free of spelling and grammatical errors
- **English only**: All user-facing text must be in English for marketplace apps
#### Confirmation Dialogs
Require user confirmation for destructive or significant actions:
```typescript
// Good: Confirm before destructive actions
const handleDisconnect = async () => {
const confirmed = await showConfirmation({
title: 'Disconnect Brevo Integration',
message: 'This will stop syncing customer data to Brevo. You can reconnect at any time.',
confirmLabel: 'Disconnect',
cancelLabel: 'Cancel',
destructive: true,
});
if (confirmed) {
await disconnectIntegration();
}
};
```
Actions that require confirmation:
- Disconnecting integrations
- Deleting synced data
- Changing settings that affect data flow
- Resetting configuration to defaults
#### Loading States
Always show loading indicators for asynchronous operations:
```typescript
// Good: Show loading state during data fetch
const CustomerSyncStatus = () => {
const { data, isLoading, error } = useSyncStatus();
if (isLoading) {
return ;
}
if (error) {
return
{error.message}
;
}
return ;
};
```
Requirements:
- Show spinners or skeleton screens during data loading
- Disable buttons during form submission
- Display progress indicators for long-running operations
- Never show a blank screen while loading
#### Error Messages
Provide clear, actionable error messages:
```typescript
// Bad: Generic error
"Something went wrong"
// Good: Specific and actionable
"Unable to sync customer data to Brevo. Please verify your Brevo API key
in Settings and try again."
```
Error message guidelines:
- Explain what happened in plain language
- Suggest a specific action the user can take to resolve the issue
- Provide a way to retry the failed operation
- Log detailed error information for debugging (not shown to users)
- Include error codes for support reference when applicable
### Security
#### Secret Store API
Use Stripe's Secret Store API for all sensitive data storage:
```typescript
import { createHttpClient, STRIPE_API_KEY } from '@stripe/ui-extension-sdk/http_client';
// Good: Store secrets using the Secret Store API
const storeBrevoApiKey = async (apiKey: string) => {
const stripe = createHttpClient(STRIPE_API_KEY);
await stripe.apps.secrets.create({
name: 'brevo_api_key',
payload: apiKey,
scope: { type: 'account' },
});
};
// Good: Retrieve secrets from the Secret Store
const getBrevoApiKey = async () => {
const stripe = createHttpClient(STRIPE_API_KEY);
const secret = await stripe.apps.secrets.find({
name: 'brevo_api_key',
scope: { type: 'account' },
});
return secret.payload;
};
```
**Never** store sensitive data in:
- Local storage or session storage
- Cookies
- URL parameters
- Hardcoded values in source code
- Plain text configuration files
#### Cryptography
- **No custom cryptography**: Do not implement your own encryption algorithms
- Use Stripe's built-in security primitives (Secret Store, signing secrets)
- Use HTTPS for all external API calls
- Validate all webhook signatures before processing
#### Data Handling
- Only request permissions your app actually needs
- Do not store Stripe data outside of what is necessary for functionality
- Implement data retention policies aligned with your privacy policy
- Provide a mechanism for users to request data deletion
### Legal Compliance
#### Privacy Policy
Your app must have a publicly accessible privacy policy that covers:
- What data your app collects from Stripe
- How the data is stored, processed, and shared
- Data retention and deletion policies
- User rights regarding their data
- Contact information for privacy inquiries
- Compliance with applicable regulations (GDPR, CCPA, etc.)
#### Terms of Service
- Provide clear terms of service for your app
- Do not include terms that conflict with Stripe's Terms of Service
- Clearly state any usage limitations or restrictions
#### Regulatory Compliance
- Comply with all applicable data protection regulations
- Implement appropriate data processing agreements
- Support data portability and deletion requests
- Maintain audit logs for data access and processing
### Review Process Timeline
| Stage | Duration |
|-------|----------|
| Initial submission | 5-10 business days |
| Revision review | 3-7 business days |
| Final approval | 1-2 business days |
| Publication | Immediate after approval |
Address all review feedback in a single revision to avoid multiple review cycles. The Stripe team provides specific, actionable feedback for each issue found.
### Common Rejection Reasons
1. **Missing error handling**, App crashes on network errors or unexpected data
2. **Insufficient loading states**, Blank screens during data fetching
3. **Unclear pricing**, Pricing not fully disclosed in the listing
4. **Excessive permissions**, Requesting permissions not needed by the app
5. **Broken sandbox mode**, App doesn't function in test mode
6. **Security issues**, Storing secrets outside the Secret Store API
7. **Missing privacy policy**, No accessible privacy policy URL
8. **Incomplete functionality**, "Coming soon" features or placeholder content
### Frequently asked questions
**What does Stripe check when reviewing an app?**
Six areas: transparent pricing, app functionality, developer standards, UX quality, security and legal compliance. The app must also work fully in sandbox or test mode and follow the Dashboard's date, time and language conventions.
**Why do Stripe Apps get rejected?**
The common reasons: missing error handling, blank screens with no loading states, pricing not fully disclosed, excessive permissions, a broken sandbox mode, secrets stored outside the Secret Store API, no accessible privacy policy, and placeholder or coming-soon features.
**Can a Stripe App show ads or promote other products?**
No. Apps must not display advertisements or cross-promote other products or services, and may show only their own brand plus integration partners such as Brevo.
**Where should a Stripe App store secrets?**
In Stripe's Secret Store API, never elsewhere, and never with custom cryptography. Storing secrets outside the Secret Store is a listed rejection reason.
**What happens if a Stripe App hides its pricing?**
It fails review. All pricing must be stated upfront in the listing, with no hidden fees after installation, clear trial terms and optional upgrade prompts. Unclear pricing is one of the listed rejection reasons.
---
## Viewports Reference
Source: https://tajo.io/docs/stripe-apps/viewports/
Complete reference of Stripe Dashboard viewports where your Stripe App UI can render
Viewports define where your Stripe App's UI components appear within the Stripe Dashboard. Each viewport corresponds to a specific Dashboard page or location where your app can render a view.
**Status: planned.** There is no Tajo app in the Stripe App Marketplace yet. The app identifiers, URLs and credentials on this page are illustrative placeholders, not live endpoints.
### How Viewports Work
When you declare a view in your app manifest, you map a React component to a viewport:
```json
{
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
}
]
}
}
```
The component renders in the app drawer (side panel) when a user navigates to the corresponding Dashboard page and opens your app.
### Dashboard-Wide vs Page-Specific Viewports
#### Dashboard-Wide Viewports
These viewports are available on every page of the Stripe Dashboard:
| Viewport ID | Description |
|-------------|-------------|
| `stripe.dashboard.drawer.default` | Default drawer view, accessible from any Dashboard page via the app icon |
| `stripe.dashboard.home.overview` | Home page overview, shown on the Dashboard landing page |
| `stripe.dashboard.settings` | App settings page, accessible from the app's settings menu |
| `stripe.dashboard.onboarding` | Onboarding flow, shown after app installation |
The `drawer.default` viewport acts as a fallback. If a user opens your app on a page where you haven't declared a specific viewport, the `drawer.default` view renders instead.
#### Page-Specific Viewports
These viewports render only when the user is on the corresponding Dashboard page:
### Payments
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.payment.list` | Payments list | `/payments` | |
| `stripe.dashboard.payment.detail` | Payment detail | `/payments/:id` | PaymentIntent |
| `stripe.dashboard.charge.detail` | Charge detail | `/payments/:id` (legacy) | Charge |
### Customers
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.customer.list` | Customers list | `/customers` | |
| `stripe.dashboard.customer.detail` | Customer detail | `/customers/:id` | Customer |
### Products & Prices
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.product.list` | Products list | `/products` | |
| `stripe.dashboard.product.detail` | Product detail | `/products/:id` | Product |
| `stripe.dashboard.price.detail` | Price detail | `/prices/:id` | Price |
### Invoices
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.invoice.list` | Invoices list | `/invoices` | |
| `stripe.dashboard.invoice.detail` | Invoice detail | `/invoices/:id` | Invoice |
### Subscriptions
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.subscription.list` | Subscriptions list | `/subscriptions` | |
| `stripe.dashboard.subscription.detail` | Subscription detail | `/subscriptions/:id` | Subscription |
### Checkout
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.checkout.session.list` | Checkout Sessions list | `/checkout/sessions` | |
| `stripe.dashboard.checkout.session.detail` | Checkout Session detail | `/checkout/sessions/:id` | CheckoutSession |
| `stripe.dashboard.payment-link.list` | Payment Links list | `/payment-links` | |
| `stripe.dashboard.payment-link.detail` | Payment Link detail | `/payment-links/:id` | PaymentLink |
### Connect
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.connect.account.list` | Connected accounts list | `/connect/accounts` | |
| `stripe.dashboard.connect.account.detail` | Connected account detail | `/connect/accounts/:id` | Account |
| `stripe.dashboard.transfer.list` | Transfers list | `/connect/transfers` | |
| `stripe.dashboard.transfer.detail` | Transfer detail | `/connect/transfers/:id` | Transfer |
### Billing
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.coupon.list` | Coupons list | `/coupons` | |
| `stripe.dashboard.coupon.detail` | Coupon detail | `/coupons/:id` | Coupon |
| `stripe.dashboard.quote.list` | Quotes list | `/quotes` | |
| `stripe.dashboard.quote.detail` | Quote detail | `/quotes/:id` | Quote |
| `stripe.dashboard.credit-note.detail` | Credit note detail | `/credit-notes/:id` | CreditNote |
### Payouts
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.payout.list` | Payouts list | `/payouts` | |
| `stripe.dashboard.payout.detail` | Payout detail | `/payouts/:id` | Payout |
### Disputes
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.dispute.list` | Disputes list | `/disputes` | |
| `stripe.dashboard.dispute.detail` | Dispute detail | `/disputes/:id` | Dispute |
### Terminal
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.terminal.reader.list` | Readers list | `/terminal/readers` | |
| `stripe.dashboard.terminal.reader.detail` | Reader detail | `/terminal/readers/:id` | TerminalReader |
| `stripe.dashboard.terminal.location.list` | Locations list | `/terminal/locations` | |
| `stripe.dashboard.terminal.location.detail` | Location detail | `/terminal/locations/:id` | TerminalLocation |
### Issuing
| Viewport ID | Page | URL Pattern | Object Type |
|-------------|------|-------------|-------------|
| `stripe.dashboard.issuing.card.list` | Cards list | `/issuing/cards` | |
| `stripe.dashboard.issuing.card.detail` | Card detail | `/issuing/cards/:id` | IssuingCard |
| `stripe.dashboard.issuing.cardholder.list` | Cardholders list | `/issuing/cardholders` | |
| `stripe.dashboard.issuing.cardholder.detail` | Cardholder detail | `/issuing/cardholders/:id` | IssuingCardholder |
| `stripe.dashboard.issuing.transaction.list` | Transactions list | `/issuing/transactions` | |
| `stripe.dashboard.issuing.authorization.list` | Authorizations list | `/issuing/authorizations` | |
### Accessing Object Context
When your app renders in a detail viewport, it receives the relevant Stripe object as context:
```typescript
import type { ExtensionContextValue } from '@stripe/ui-extension-sdk/context';
const CustomerDetailView = ({ environment }: ExtensionContextValue) => {
const { objectContext } = environment;
// objectContext contains the current Stripe object
const customerId = objectContext?.id; // "cus_xxxxx"
const customerEmail = objectContext?.email;
return (
Customer: {customerEmail}Brevo Sync Status: checking...
);
};
```
#### List vs Detail Context
| Viewport Type | Object Context | Use Case |
|---------------|---------------|----------|
| **List** (e.g., `customer.list`) | Not available, no specific object selected | Show aggregate data, summary views, or batch actions |
| **Detail** (e.g., `customer.detail`) | Full Stripe object for the current page | Show object-specific data, actions, and integrations |
### Recommended Viewports for Tajo Brevo Integration
For the Tajo Brevo integration app, these viewports provide the most value:
```json
{
"ui_extension": {
"views": [
{
"viewport": "stripe.dashboard.customer.detail",
"component": "CustomerDetailView"
},
{
"viewport": "stripe.dashboard.customer.list",
"component": "CustomerListView"
},
{
"viewport": "stripe.dashboard.payment.detail",
"component": "PaymentDetailView"
},
{
"viewport": "stripe.dashboard.subscription.detail",
"component": "SubscriptionDetailView"
},
{
"viewport": "stripe.dashboard.home.overview",
"component": "OverviewView"
},
{
"viewport": "stripe.dashboard.drawer.default",
"component": "DrawerView"
},
{
"viewport": "stripe.dashboard.settings",
"component": "SettingsView"
},
{
"viewport": "stripe.dashboard.onboarding",
"component": "OnboardingView"
}
]
}
}
```
| Component | Purpose |
|-----------|---------|
| **CustomerDetailView** | Show Brevo contact info, sync status, and engagement data for a specific customer |
| **CustomerListView** | Show batch sync controls and aggregate Brevo sync statistics |
| **PaymentDetailView** | Show which Brevo events were triggered by this payment |
| **SubscriptionDetailView** | Show Brevo automation status for this subscription |
| **OverviewView** | Dashboard home widget with sync health and key Brevo metrics |
| **DrawerView** | General app drawer with quick actions and status overview |
| **SettingsView** | Configure Brevo API key, sync preferences, and field mappings |
| **OnboardingView** | Guide new users through connecting their Brevo account |
### Viewport Availability
Not all viewports are available in all Stripe Dashboard modes:
| Mode | Available Viewports |
|------|-------------------|
| **Live mode** | All viewports |
| **Test mode** | All viewports (uses test data) |
| **Sandbox** | All viewports (if `sandbox_install_compatible: true`) |
If your manifest declares a viewport that doesn't exist, the app upload will fail validation. Always verify viewport IDs against this reference.
### Frequently asked questions
**What is a viewport in a Stripe App?**
A location in the Stripe Dashboard where the app's React component renders, declared in the manifest by mapping a component to a viewport id. Dashboard-wide viewports appear on every page; page-specific ones such as customer or payment detail render only on that page. The Tajo Stripe app is still planned.
**What is the difference between a list and a detail viewport?**
A detail viewport such as customer.detail receives the full Stripe object of the current page as context, so the app can show object-specific data and actions. A list viewport such as customer.list has no selected object and suits summaries or batch actions.
**Which viewports would a Stripe to Brevo app use?**
Customer detail for the Brevo contact, sync status and engagement; customer list for batch sync; payment and subscription detail for the Brevo events and automations they triggered; the overview widget for sync health; plus drawer, settings and onboarding views.
**Do viewports work in test mode and sandboxes?**
Yes. All viewports are available in live mode and in test mode with test data, and in sandboxes when the manifest sets sandbox_install_compatible to true.
---
## testing debug
Source: https://tajo.io/docs/testing-debug/
Documentation for testing debug
This section is under development. More content coming soon.
---
## Advanced Techniques
Source: https://tajo.io/docs/tutorials/advanced-techniques/
Advanced tips and tricks for using our platform efficiently
**Demo Page** - This is a demo page to showcase the multi-tab documentation feature. This content is for illustration purposes only.
This guide covers advanced techniques and tips for getting the most out of our platform.
### Keyboard Shortcuts
Using keyboard shortcuts can significantly improve your workflow efficiency:
| Action | Windows/Linux | macOS |
|--------|--------------|-------|
| Save | Ctrl + S | ⌘ + S |
| Undo | Ctrl + Z | ⌘ + Z |
| Copy | Ctrl + C | ⌘ + C |
| Find | Ctrl + F | ⌘ + F |
| Quick Navigation | Ctrl + P | ⌘ + P |
### Batch Processing
When working with multiple files, use our batch processing feature to apply changes efficiently:
```javascript
// Example batch processing code
const batchProcessor = new BatchProcessor();
batchProcessor
.addFiles(['file1.jpg', 'file2.jpg', 'file3.jpg'])
.setResolution(1200, 800)
.applyFilter('sharpening', 0.5)
.process();
```
### Custom Templates
You can create custom templates for frequently used configurations:
1. Go to **Settings > Templates**
2. Click **Create New Template**
3. Configure your template settings
4. Save with a descriptive name
These templates can then be accessed from the quick menu by pressing Ctrl + T (⌘ + T on macOS).
### Advanced Search Techniques
Our search feature supports advanced syntax for more precise queries:
| Syntax | Description | Example |
|--------|-------------|---------|
| `"exact phrase"` | Searches for an exact phrase | `"project management"` |
| `keyword1 OR keyword2` | Matches either keyword | `meeting OR conference` |
| `keyword -excluded` | Excludes results containing the word | `report -draft` |
| `tag:keyword` | Searches only in tags | `tag:urgent` |
| `created:YYYY-MM-DD` | Filters by creation date | `created:2023-05-30` |
### Automation Scripts
You can automate repetitive tasks using our automation API:
```javascript
// Example automation script
async function nightlyBackup() {
const api = new AutomationAPI(API_KEY);
// Get all projects
const projects = await api.getProjects();
// Back up each project
for (const project of projects) {
await api.createBackup(project.id, {
destination: 's3://my-backup-bucket',
includeAssets: true,
compression: 'high'
});
console.log(`Backed up project: ${project.name}`);
}
}
```
### Performance Optimization
For large projects, consider these performance optimization techniques:
1. **Enable asset caching** in Settings > Performance
2. **Optimize image assets** using the built-in optimizer
3. **Use lazy loading** for media-heavy pages
4. **Split large projects** into smaller linked projects
5. **Archive old versions** instead of keeping them in the active project
### Collaborative Workflow Tips
When working in a team:
1. **Use branching** for experimental changes
2. **Create review templates** for consistent feedback
3. **Set up automated notifications** for critical changes
4. **Use the activity log** to track project history
5. **Schedule regular sync points** using the calendar integration
These advanced techniques should help you work more efficiently and get the most out of our platform.
---
## webhook configuration
Source: https://tajo.io/docs/webhook-configuration/
Documentation for webhook configuration
This section is under development. More content coming soon.
---
## Webhook Setup Guide
Source: https://tajo.io/docs/webhook-configuration/setup-guide/
Complete guide to setting up and configuring Brevo webhooks for real-time Tajo loyalty platform integration
Webhooks enable real-time communication between Brevo and your Tajo loyalty platform. This guide walks you through the complete setup process.
### Overview
Webhooks allow Brevo to automatically notify your Tajo application when specific events occur, such as:
- **Email events**: Delivered, opened, clicked, bounced
- **SMS events**: Sent, delivered, failed, replied
- **Contact events**: Created, updated, unsubscribed
- **Campaign events**: Started, completed, paused
### Prerequisites
Before setting up webhooks, ensure you have:
- **HTTPS endpoint** for receiving webhooks (SSL required)
- **Webhook secret** for signature verification
- **Server environment** capable of handling HTTP POST requests
- **Brevo account** with webhook access permissions
### Step 1: Prepare Your Webhook Endpoint
#### Create Webhook Handler
```javascript
import express from 'express';
import crypto from 'crypto';
import { TajoLoyaltyService } from './loyalty-service.js';
const app = express();
const loyaltyService = new TajoLoyaltyService();
// Middleware to capture raw body for signature verification
app.use('/webhooks/brevo', express.raw({
type: 'application/json',
limit: '10mb'
}));
// Main webhook handler
app.post('/webhooks/brevo', async (req, res) => {
try {
// Verify webhook signature
const signature = req.headers['x-brevo-signature'];
if (!verifyWebhookSignature(req.body, signature)) {
console.warn('Invalid webhook signature received');
return res.status(401).json({ error: 'Unauthorized: Invalid signature' });
}
// Parse webhook payload
const event = JSON.parse(req.body.toString());
console.log('Received webhook event:', event.event, event.email);
// Route to appropriate handler
await handleWebhookEvent(event);
// Respond quickly (Brevo expects response within 5 seconds)
res.status(200).json({
success: true,
eventId: event['message-id'],
timestamp: new Date().toISOString()
});
} catch (error) {
console.error('Webhook processing error:', error);
res.status(500).json({
error: 'Internal server error',
message: error.message
});
}
});
// Signature verification function
function verifyWebhookSignature(payload, signature) {
if (!process.env.BREVO_WEBHOOK_SECRET || !signature) {
return false;
}
const expectedSignature = crypto
.createHmac('sha256', process.env.BREVO_WEBHOOK_SECRET)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature.replace('sha256=', ''), 'hex'),
Buffer.from(expectedSignature, 'hex')
);
}
// Event router
async function handleWebhookEvent(event) {
switch (event.event) {
// Email events
case 'delivered':
await handleEmailDelivered(event);
break;
case 'opened':
await handleEmailOpened(event);
break;
case 'clicked':
await handleEmailClicked(event);
break;
case 'bounced':
case 'hard_bounced':
await handleEmailBounced(event);
break;
case 'spam':
await handleEmailSpam(event);
break;
case 'unsubscribed':
await handleEmailUnsubscribed(event);
break;
// SMS events
case 'sms_delivered':
await handleSMSDelivered(event);
break;
case 'sms_failed':
await handleSMSFailed(event);
break;
case 'sms_reply':
await handleSMSReply(event);
break;
// Contact events
case 'contact_created':
await handleContactCreated(event);
break;
case 'contact_updated':
await handleContactUpdated(event);
break;
case 'list_addition':
await handleListAddition(event);
break;
default:
console.warn('Unhandled webhook event:', event.event);
}
}
```
#### Email Event Handlers
```javascript
// Handle email delivery confirmation
async function handleEmailDelivered(event) {
const customerEmail = event.email;
const messageId = event['message-id'];
await loyaltyService.updateCustomerEngagement(customerEmail, {
lastEmailDelivered: new Date(),
emailDeliveryRate: 'increment'
});
// Log for analytics
console.log(`Email delivered to ${customerEmail}: ${messageId}`);
}
// Handle email opens (key engagement metric)
async function handleEmailOpened(event) {
const customerEmail = event.email;
const subject = event.subject;
const timestamp = new Date(event.ts * 1000);
// Update customer engagement score
await loyaltyService.updateCustomerEngagement(customerEmail, {
lastEmailOpened: timestamp,
emailOpenRate: 'increment',
engagementScore: 'increase'
});
// Track loyalty campaign engagement
if (event.tag?.includes('loyalty')) {
await loyaltyService.trackLoyaltyEngagement(customerEmail, {
event: 'email_opened',
campaign: extractCampaignFromSubject(subject),
timestamp: timestamp
});
}
console.log(`Email opened by ${customerEmail}: "${subject}"`);
}
// Handle email clicks (high-value engagement)
async function handleEmailClicked(event) {
const customerEmail = event.email;
const clickedUrl = event.link;
const timestamp = new Date(event.ts * 1000);
// High-value engagement - boost customer score
await loyaltyService.updateCustomerEngagement(customerEmail, {
lastEmailClicked: timestamp,
emailClickRate: 'increment',
engagementScore: 'boost'
});
// Track reward page visits
if (clickedUrl.includes('/rewards') || clickedUrl.includes('/loyalty')) {
await loyaltyService.trackEvent(customerEmail, 'Rewards Page Visited', {
source: 'email',
referrer_url: clickedUrl,
timestamp: timestamp
});
}
console.log(`Email link clicked by ${customerEmail}: ${clickedUrl}`);
}
// Handle email bounces (delivery issues)
async function handleEmailBounced(event) {
const customerEmail = event.email;
const bounceReason = event.reason;
const bounceType = event.event; // 'bounced' or 'hard_bounced'
if (bounceType === 'hard_bounced') {
// Hard bounce - email address invalid
await loyaltyService.updateCustomerStatus(customerEmail, {
emailStatus: 'invalid',
emailBounced: true,
bounceReason: bounceReason,
lastBounce: new Date()
});
// Consider switching to SMS for critical notifications
await loyaltyService.suggestAlternativeChannel(customerEmail, 'sms');
} else {
// Soft bounce - temporary issue
await loyaltyService.updateCustomerEngagement(customerEmail, {
emailBounceCount: 'increment',
lastBounce: new Date()
});
}
console.warn(`Email bounced for ${customerEmail}: ${bounceReason}`);
}
// Handle spam reports (reputation management)
async function handleEmailSpam(event) {
const customerEmail = event.email;
// Mark customer as unengaged to prevent future spam reports
await loyaltyService.updateCustomerStatus(customerEmail, {
emailStatus: 'spam_reported',
marketingEnabled: false,
lastSpamReport: new Date()
});
// Alert marketing team for review
await loyaltyService.alertMarketing('spam_report', {
email: customerEmail,
campaign: event.tag
});
console.warn(`Spam reported by ${customerEmail}`);
}
```
#### SMS Event Handlers
```javascript
// Handle SMS delivery confirmation
async function handleSMSDelivered(event) {
const customerPhone = event.phone;
const messageId = event['message-id'];
await loyaltyService.updateCustomerEngagement(customerPhone, {
lastSMSDelivered: new Date(),
smsDeliveryRate: 'increment'
});
console.log(`SMS delivered to ${customerPhone}: ${messageId}`);
}
// Handle SMS failures
async function handleSMSFailed(event) {
const customerPhone = event.phone;
const failureReason = event.reason;
await loyaltyService.updateCustomerStatus(customerPhone, {
smsStatus: 'failed',
smsFailureReason: failureReason,
lastSMSFailure: new Date()
});
// If SMS fails, consider email as alternative
const customer = await loyaltyService.getCustomerByPhone(customerPhone);
if (customer?.email) {
await loyaltyService.suggestAlternativeChannel(customer.email, 'email');
}
console.warn(`SMS failed for ${customerPhone}: ${failureReason}`);
}
// Handle SMS replies (two-way communication)
async function handleSMSReply(event) {
const customerPhone = event.phone;
const replyText = event.text.toLowerCase().trim();
// Process common replies
if (replyText === 'stop' || replyText === 'unsubscribe') {
await loyaltyService.unsubscribeFromSMS(customerPhone);
} else if (replyText === 'help' || replyText === 'info') {
await loyaltyService.sendSMSHelp(customerPhone);
} else {
// Forward to customer service
await loyaltyService.forwardSMSToSupport(customerPhone, replyText);
}
console.log(`SMS reply from ${customerPhone}: "${replyText}"`);
}
```
### Step 2: Configure Webhook in Brevo
#### Via Brevo Dashboard
1. **Log into Brevo account**
2. **Navigate to Developers > Webhooks**
3. **Click "Add a new webhook"**
4. **Configure webhook settings:**
```json
{
"url": "https://your-tajo-domain.com/webhooks/brevo",
"description": "Tajo Loyalty Platform Integration",
"events": [
"delivered",
"opened",
"clicked",
"bounced",
"hard_bounced",
"spam",
"unsubscribed",
"sms_delivered",
"sms_failed",
"sms_reply",
"contact_created",
"contact_updated"
]
}
```
#### Via API
```javascript
import { WebhooksApi } from '@getbrevo/brevo';
async function createWebhook() {
const webhooksApi = new WebhooksApi();
const createWebhook = {
url: 'https://your-tajo-domain.com/webhooks/brevo',
description: 'Tajo Loyalty Platform Integration',
events: [
'delivered',
'opened',
'clicked',
'bounced',
'hard_bounced',
'spam',
'unsubscribed',
'sms_delivered',
'sms_failed',
'sms_reply',
'contact_created',
'contact_updated'
]
};
try {
const response = await webhooksApi.createWebhook(createWebhook);
console.log('Webhook created successfully:', response.id);
return response;
} catch (error) {
console.error('Error creating webhook:', error);
throw error;
}
}
```
### Step 3: Security Implementation
#### Environment Variables
```bash
# .env file
BREVO_WEBHOOK_SECRET=your-super-secure-webhook-secret-here
BREVO_API_KEY=xkeysib-your-api-key-here
WEBHOOK_RATE_LIMIT=1000
WEBHOOK_TIMEOUT=5000
```
#### Rate Limiting
```javascript
import rateLimit from 'express-rate-limit';
const webhookLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 1000, // Limit each IP to 1000 requests per windowMs
message: 'Too many webhook requests from this IP',
standardHeaders: true,
legacyHeaders: false,
});
app.use('/webhooks/brevo', webhookLimiter);
```
#### IP Whitelist (Optional)
```javascript
const brevoIPs = [
'185.41.28.0/24',
'185.41.29.0/24',
'217.182.196.0/24'
];
function isBrevoIP(ip) {
// Implement IP range checking
return brevoIPs.some(range => ipInRange(ip, range));
}
app.use('/webhooks/brevo', (req, res, next) => {
const clientIP = req.ip || req.connection.remoteAddress;
if (process.env.NODE_ENV === 'production' && !isBrevoIP(clientIP)) {
return res.status(403).json({ error: 'Forbidden: Invalid source IP' });
}
next();
});
```
### Step 4: Testing Webhooks
#### Test Webhook Handler
```javascript
// Test endpoint for webhook verification
app.post('/webhooks/brevo/test', (req, res) => {
const testEvent = {
event: 'test',
email: 'test@example.com',
'message-id': 'test-message-id',
timestamp: Date.now() / 1000,
tags: ['test', 'loyalty']
};
console.log('Test webhook received:', testEvent);
res.status(200).json({
success: true,
message: 'Test webhook processed successfully',
receivedAt: new Date().toISOString()
});
});
```
#### Manual Testing
```bash
# Test webhook endpoint with curl
curl -X POST https://your-domain.com/webhooks/brevo/test \
-H "Content-Type: application/json" \
-H "X-Brevo-Signature: sha256=test-signature" \
-d '{
"event": "delivered",
"email": "test@example.com",
"message-id": "test-123",
"ts": 1640995200
}'
```
#### Webhook Validation
```javascript
class WebhookValidator {
static validateEvent(event) {
const required = ['event', 'email', 'message-id'];
const missing = required.filter(field => !event[field]);
if (missing.length > 0) {
throw new Error(`Missing required fields: ${missing.join(', ')}`);
}
// Validate email format
if (!this.isValidEmail(event.email)) {
throw new Error('Invalid email format');
}
// Validate event type
const validEvents = [
'delivered', 'opened', 'clicked', 'bounced', 'hard_bounced',
'spam', 'unsubscribed', 'sms_delivered', 'sms_failed'
];
if (!validEvents.includes(event.event)) {
throw new Error(`Invalid event type: ${event.event}`);
}
return true;
}
static isValidEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
}
```
### Step 5: Monitoring and Logging
#### Webhook Monitoring
```javascript
import winston from 'winston';
const webhookLogger = winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp(),
winston.format.json()
),
transports: [
new winston.transports.File({ filename: 'webhook-error.log', level: 'error' }),
new winston.transports.File({ filename: 'webhook-combined.log' })
]
});
// Add monitoring middleware
app.use('/webhooks/brevo', (req, res, next) => {
const startTime = Date.now();
res.on('finish', () => {
const duration = Date.now() - startTime;
webhookLogger.info('Webhook processed', {
method: req.method,
url: req.url,
statusCode: res.statusCode,
duration: duration,
userAgent: req.headers['user-agent'],
contentLength: req.headers['content-length']
});
});
next();
});
```
#### Health Check Endpoint
```javascript
app.get('/webhooks/brevo/health', async (req, res) => {
const health = {
status: 'healthy',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
version: process.env.npm_package_version,
environment: process.env.NODE_ENV,
checks: {
database: await checkDatabaseConnection(),
redis: await checkRedisConnection(),
brevoAPI: await checkBrevoAPIConnection()
}
};
const allHealthy = Object.values(health.checks).every(check => check.status === 'ok');
res.status(allHealthy ? 200 : 503).json(health);
});
```
### Step 6: Error Handling and Recovery
#### Retry Logic
```javascript
class WebhookProcessor {
constructor() {
this.maxRetries = 3;
this.retryDelay = 1000; // 1 second
}
async processEvent(event, retries = 0) {
try {
await this.handleEvent(event);
} catch (error) {
if (retries < this.maxRetries && this.isRetryableError(error)) {
console.warn(`Webhook processing failed, retrying... (${retries + 1}/${this.maxRetries})`);
await this.delay(this.retryDelay * Math.pow(2, retries)); // Exponential backoff
return this.processEvent(event, retries + 1);
}
// Max retries reached or non-retryable error
await this.handleFailedEvent(event, error);
throw error;
}
}
isRetryableError(error) {
// Retry on temporary failures
return error.code === 'ECONNRESET' ||
error.code === 'ETIMEDOUT' ||
(error.status >= 500 && error.status < 600);
}
async handleFailedEvent(event, error) {
// Store failed event for manual review
await loyaltyService.storeFailedEvent(event, error.message);
// Alert operations team for critical events
if (this.isCriticalEvent(event)) {
await loyaltyService.alertOps('webhook_failure', {
event: event.event,
email: event.email,
error: error.message
});
}
}
delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
```
#### Dead Letter Queue
```javascript
import Bull from 'bull';
const webhookQueue = new Bull('webhook processing', process.env.REDIS_URL);
const deadLetterQueue = new Bull('webhook failed', process.env.REDIS_URL);
webhookQueue.process(async (job) => {
const { event } = job.data;
await handleWebhookEvent(event);
});
webhookQueue.on('failed', async (job, err) => {
console.error(`Webhook job failed: ${err.message}`);
// Add to dead letter queue for manual processing
await deadLetterQueue.add('failed webhook', {
originalEvent: job.data.event,
error: err.message,
failedAt: new Date(),
attempts: job.attemptsMade
});
});
```
### Troubleshooting Common Issues
#### 1. Signature Verification Fails
```javascript
// Debug signature verification
function debugSignature(payload, receivedSignature) {
const expectedSignature = crypto
.createHmac('sha256', process.env.BREVO_WEBHOOK_SECRET)
.update(payload)
.digest('hex');
console.log('Received signature:', receivedSignature);
console.log('Expected signature:', expectedSignature);
console.log('Payload length:', payload.length);
console.log('First 100 chars:', payload.slice(0, 100));
return expectedSignature === receivedSignature.replace('sha256=', '');
}
```
#### 2. Missing Events
Check webhook configuration:
```javascript
async function auditWebhookConfig() {
const webhooksApi = new WebhooksApi();
try {
const webhooks = await webhooksApi.getWebhooks();
webhooks.webhooks.forEach(webhook => {
console.log('Webhook ID:', webhook.id);
console.log('URL:', webhook.url);
console.log('Events:', webhook.events);
console.log('Status:', webhook.is_enabled ? 'enabled' : 'disabled');
});
} catch (error) {
console.error('Error auditing webhooks:', error);
}
}
```
#### 3. High Latency
Optimize webhook processing:
```javascript
// Process webhooks asynchronously
app.post('/webhooks/brevo', async (req, res) => {
// Verify signature quickly
if (!verifyWebhookSignature(req.body, req.headers['x-brevo-signature'])) {
return res.status(401).json({ error: 'Unauthorized' });
}
// Respond immediately
res.status(200).json({ success: true });
// Process event asynchronously
const event = JSON.parse(req.body.toString());
webhookQueue.add('process event', { event }, {
attempts: 3,
backoff: {
type: 'exponential',
delay: 2000
}
});
});
```
### Next Steps
- **Webhook Security Guide** - Advanced security practices
- **[Event Types Reference](/docs/webhooks-events/event-types)** - Complete event documentation
- **[Testing Webhooks](/docs/testing-debug/)** - Testing and debugging guide
- **Webhook Analytics** - Monitor webhook performance
### Frequently asked questions
**What events can Brevo webhooks send to my app?**
Email events such as delivered, opened, clicked, bounced, spam and unsubscribed; SMS events such as sent, delivered, failed and replied; contact events such as created, updated and unsubscribed; and campaign events such as started, completed and paused.
**What do I need before setting up Brevo webhooks?**
An HTTPS endpoint with SSL that accepts HTTP POST, a webhook secret for signature verification, and a Brevo account with webhook access permissions.
**How do I add a webhook in the Brevo dashboard or through the API?**
In the Brevo dashboard go to Developers, Webhooks, click Add a new webhook and set the URL, description and events, or create it through the API with the same fields, for example delivered, opened, clicked, bounced, hard_bounced, spam, unsubscribed, sms_delivered, sms_failed, sms_reply, contact_created and contact_updated.
**How do I verify a Brevo webhook signature?**
Compute an HMAC-SHA256 hex digest of the raw request body with your webhook secret and compare it in constant time with the signature header, stripping any sha256= prefix. Read the body as raw bytes before any JSON parsing.
**How should my webhook handler deal with slow processing or failures?**
Return 200 immediately, then process the event from a queue with about 3 attempts and exponential backoff starting at 2 seconds. Retry only on network timeouts and 5xx errors, and move events that keep failing to a dead letter queue for review.
**Why does my Brevo webhook signature verification fail?**
Usually the body was modified before hashing, the wrong secret is loaded, or the digest encoding differs. Log the computed and received signatures side by side on a test event to find the mismatch.
---
## Event Types Reference
Source: https://tajo.io/docs/webhooks-events/event-types/
Complete reference guide for all Brevo webhook event types with Tajo loyalty platform integration examples
This comprehensive reference covers all webhook event types available in Brevo, with specific examples for Tajo loyalty platform integration.
### Email Events
#### delivered
Triggered when an email is successfully delivered to the recipient's mailbox.
**Payload Example:**
```json
{
"event": "delivered",
"email": "customer@example.com",
"id": 123456,
"date": "2024-01-25 14:30:00",
"ts": 1640995200,
"message-id": "<202401251430.123456@mail.brevo.com>",
"template_id": 101,
"tags": ["loyalty", "points-earned"],
"sending_ip": "185.107.232.1",
"event_id": "evt_abc123"
}
```
**Tajo Integration Use Cases:**
- Update delivery success rate in customer profiles
- Trigger follow-up actions for loyalty campaigns
- Track email delivery performance by tier
```javascript
async function handleEmailDelivered(event) {
const customer = await loyaltyService.getCustomer(event.email);
// Update delivery stats
await loyaltyService.updateEngagement(event.email, {
emailsDelivered: customer.emailsDelivered + 1,
lastEmailDelivered: new Date(event.date),
deliveryRate: calculateDeliveryRate(customer)
});
// Track loyalty campaign delivery
if (event.tags.includes('loyalty')) {
await loyaltyService.trackCampaignMetric('loyalty_email_delivered', {
email: event.email,
template_id: event.template_id,
tier: customer.loyaltyTier
});
}
}
```
#### opened
Triggered when a recipient opens an email (tracks pixel loading).
**Payload Example:**
```json
{
"event": "opened",
"email": "customer@example.com",
"date": "2024-01-25 15:45:00",
"ts": 1641000300,
"message-id": "<202401251430.123456@mail.brevo.com>",
"template_id": 101,
"tags": ["loyalty", "tier-upgrade"],
"user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X)",
"geo": {
"country": "US",
"region": "CA",
"city": "San Francisco"
}
}
```
**Tajo Integration Use Cases:**
- Boost customer engagement scores
- Track loyalty campaign effectiveness
- Trigger behavior-based rewards
- Personalize future communications
```javascript
async function handleEmailOpened(event) {
const customer = await loyaltyService.getCustomer(event.email);
// Significant engagement - boost score
await loyaltyService.updateEngagement(event.email, {
emailsOpened: customer.emailsOpened + 1,
lastEmailOpened: new Date(event.date),
engagementScore: customer.engagementScore + 5,
preferredDevice: getDeviceType(event['user-agent'])
});
// Reward engagement for loyalty members
if (event.tags.includes('loyalty') && customer.loyaltyTier) {
await loyaltyService.awardEngagementBonus(event.email, {
type: 'email_engagement',
points: getEngagementPoints(customer.loyaltyTier),
reason: 'Email opened'
});
}
// Track timing patterns for optimization
await loyaltyService.recordEngagementTime(event.email, {
campaign: event.template_id,
openTime: new Date(event.date),
timezone: getTimezone(event.geo)
});
}
```
#### clicked
Triggered when a recipient clicks on a link in an email.
**Payload Example:**
```json
{
"event": "clicked",
"email": "customer@example.com",
"date": "2024-01-25 16:20:00",
"ts": 1641002400,
"message-id": "<202401251430.123456@mail.brevo.com>",
"template_id": 101,
"tags": ["loyalty", "rewards-reminder"],
"link": "https://yourdomain.com/rewards?utm_source=brevo&utm_campaign=loyalty",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
```
**Tajo Integration Use Cases:**
- Track conversion funnel performance
- Award click-through bonuses
- Identify high-value content
- Optimize email-to-website flow
```javascript
async function handleEmailClicked(event) {
const customer = await loyaltyService.getCustomer(event.email);
const clickedUrl = new URL(event.link);
// High-value engagement
await loyaltyService.updateEngagement(event.email, {
emailsClicked: customer.emailsClicked + 1,
lastEmailClicked: new Date(event.date),
engagementScore: customer.engagementScore + 15,
clickThroughRate: calculateCTR(customer)
});
// Track specific link types
if (clickedUrl.pathname.includes('/rewards')) {
await loyaltyService.trackEvent(event.email, 'Rewards Page Clicked', {
source: 'email',
campaign: event.template_id,
utm_campaign: clickedUrl.searchParams.get('utm_campaign')
});
// Award exploration bonus
await loyaltyService.awardEngagementBonus(event.email, {
type: 'rewards_exploration',
points: 10,
reason: 'Clicked rewards link'
});
}
// Track product interest
if (clickedUrl.pathname.includes('/products')) {
const productId = extractProductId(clickedUrl);
await loyaltyService.trackProductInterest(event.email, productId, {
source: 'email_click',
timestamp: new Date(event.date)
});
}
}
```
#### bounced / hard_bounced
Triggered when an email bounces (temporary failure) or hard bounces (permanent failure).
**Payload Example:**
```json
{
"event": "hard_bounced",
"email": "invalid@example.com",
"date": "2024-01-25 14:35:00",
"ts": 1640995500,
"message-id": "<202401251430.123456@mail.brevo.com>",
"template_id": 101,
"tags": ["loyalty"],
"reason": "550 5.1.1 User unknown",
"bounce_type": "hard"
}
```
**Tajo Integration Use Cases:**
- Update email validity status
- Switch to alternative communication channels
- Clean customer database
- Prevent further sending to invalid addresses
```javascript
async function handleEmailBounced(event) {
const isHardBounce = event.event === 'hard_bounced' || event.bounce_type === 'hard';
if (isHardBounce) {
// Permanent failure - mark email as invalid
await loyaltyService.updateCustomerStatus(event.email, {
emailStatus: 'invalid',
emailBounced: true,
bounceReason: event.reason,
lastBounce: new Date(event.date),
communicationPreference: 'sms' // Switch to SMS if available
});
// Remove from email marketing lists
await loyaltyService.removeFromEmailMarketing(event.email);
// Suggest phone verification
const customer = await loyaltyService.getCustomer(event.email);
if (customer?.phone) {
await loyaltyService.suggestPhoneVerification(customer.phone);
}
} else {
// Soft bounce - temporary issue
await loyaltyService.updateEngagement(event.email, {
softBounceCount: customer.softBounceCount + 1,
lastSoftBounce: new Date(event.date)
});
// Retry logic for soft bounces
if (customer.softBounceCount < 5) {
await loyaltyService.scheduleEmailRetry(event.email, event.template_id);
}
}
}
```
#### spam
Triggered when a recipient marks an email as spam.
**Payload Example:**
```json
{
"event": "spam",
"email": "customer@example.com",
"date": "2024-01-25 17:10:00",
"ts": 1641005400,
"message-id": "<202401251430.123456@mail.brevo.com>",
"template_id": 101,
"tags": ["loyalty", "promotional"]
}
```
**Tajo Integration Use Cases:**
- Immediately stop email communications
- Review and improve email content
- Analyze spam patterns by segment
- Implement stricter opt-in processes
```javascript
async function handleEmailSpam(event) {
// Immediately disable email marketing
await loyaltyService.updateCustomerPreferences(event.email, {
emailMarketing: false,
marketingEnabled: false,
spamReported: true,
spamReportDate: new Date(event.date)
});
// Alert marketing team for review
await loyaltyService.alertMarketing('spam_complaint', {
email: event.email,
template: event.template_id,
campaign_tags: event.tags,
severity: 'high'
});
// Analyze spam patterns
await loyaltyService.analyzeSpamPattern({
template_id: event.template_id,
tags: event.tags,
customer_segment: await loyaltyService.getCustomerSegment(event.email)
});
// Consider account review if multiple spam reports
const customer = await loyaltyService.getCustomer(event.email);
if (customer.spamReports > 2) {
await loyaltyService.flagForReview(event.email, 'multiple_spam_reports');
}
}
```
### SMS Events
#### sms_delivered
Triggered when an SMS is successfully delivered to the recipient's phone.
**Payload Example:**
```json
{
"event": "sms_delivered",
"phone": "+1234567890",
"date": "2024-01-25 14:45:00",
"ts": 1640996700,
"message-id": "sms_abc123",
"tags": ["loyalty", "points-alert"],
"sender": "TAJO",
"content": "🎉 Great news! You earned 150 points from your recent purchase. Total: 1,250 points."
}
```
**Tajo Integration Use Cases:**
- Confirm successful SMS delivery
- Track SMS engagement rates
- Validate phone number accuracy
- Monitor carrier delivery performance
```javascript
async function handleSMSDelivered(event) {
const customer = await loyaltyService.getCustomerByPhone(event.phone);
await loyaltyService.updateEngagement(customer.email, {
smsDelivered: customer.smsDelivered + 1,
lastSMSDelivered: new Date(event.date),
smsDeliveryRate: calculateSMSDeliveryRate(customer),
phoneStatus: 'valid'
});
// Track loyalty SMS performance
if (event.tags.includes('loyalty')) {
await loyaltyService.trackCampaignMetric('loyalty_sms_delivered', {
phone: event.phone,
content_type: getSMSContentType(event.content),
customer_tier: customer.loyaltyTier
});
}
}
```
#### sms_failed
Triggered when SMS delivery fails.
**Payload Example:**
```json
{
"event": "sms_failed",
"phone": "+1234567890",
"date": "2024-01-25 14:32:00",
"ts": 1640996320,
"message-id": "sms_def456",
"tags": ["loyalty", "urgent"],
"sender": "TAJO",
"reason": "Invalid phone number format",
"error_code": "30006"
}
```
**Tajo Integration Use Cases:**
- Update phone number validity
- Switch to email notifications
- Clean phone number database
- Alert customer service for manual verification
```javascript
async function handleSMSFailed(event) {
const customer = await loyaltyService.getCustomerByPhone(event.phone);
await loyaltyService.updateCustomerStatus(customer.email, {
phoneStatus: 'invalid',
smsEnabled: false,
smsFailureReason: event.reason,
lastSMSFailure: new Date(event.date),
communicationPreference: 'email'
});
// For urgent loyalty notifications, fall back to email
if (event.tags.includes('urgent') || event.tags.includes('loyalty')) {
await loyaltyService.sendEmailFallback(customer.email, {
originalSMS: event.content,
reason: 'SMS delivery failed'
});
}
// Flag for phone number verification
await loyaltyService.flagForPhoneVerification(customer.email);
}
```
#### sms_reply
Triggered when a recipient replies to an SMS.
**Payload Example:**
```json
{
"event": "sms_reply",
"phone": "+1234567890",
"date": "2024-01-25 15:20:00",
"ts": 1641000000,
"message-id": "sms_reply_123",
"text": "BALANCE",
"original_message_id": "sms_abc123"
}
```
**Tajo Integration Use Cases:**
- Process loyalty program commands
- Handle customer service requests
- Update communication preferences
- Trigger automated responses
```javascript
async function handleSMSReply(event) {
const customer = await loyaltyService.getCustomerByPhone(event.phone);
const replyText = event.text.toUpperCase().trim();
// High engagement - customer actively participating
await loyaltyService.updateEngagement(customer.email, {
smsReplies: customer.smsReplies + 1,
lastSMSReply: new Date(event.date),
engagementScore: customer.engagementScore + 10
});
// Process loyalty commands
switch (replyText) {
case 'BALANCE':
await loyaltyService.sendPointsBalance(event.phone);
break;
case 'REWARDS':
await loyaltyService.sendAvailableRewards(event.phone, customer.loyaltyTier);
break;
case 'TIER':
await loyaltyService.sendTierInfo(event.phone, customer);
break;
case 'HELP':
await loyaltyService.sendSMSHelp(event.phone);
break;
case 'STOP':
case 'UNSUBSCRIBE':
await loyaltyService.unsubscribeFromSMS(event.phone);
break;
default:
// Forward to customer service
await loyaltyService.forwardToSupport(customer.email, {
channel: 'sms',
message: event.text,
timestamp: new Date(event.date)
});
}
}
```
### Contact Events
#### contact_created
Triggered when a new contact is added to Brevo.
**Payload Example:**
```json
{
"event": "contact_created",
"email": "newcustomer@example.com",
"date": "2024-01-25 13:15:00",
"ts": 1640992500,
"attributes": {
"FIRSTNAME": "John",
"LASTNAME": "Doe",
"LOYALTY_ID": "LYL-2024-001",
"LOYALTY_TIER": "Bronze",
"LOYALTY_POINTS": 0
},
"lists": [1, 5]
}
```
**Tajo Integration Use Cases:**
- Trigger welcome campaigns
- Set up loyalty program enrollment
- Initialize customer journey
- Award signup bonuses
```javascript
async function handleContactCreated(event) {
const isLoyaltyMember = event.attributes?.LOYALTY_ID;
if (isLoyaltyMember) {
// New loyalty member - trigger welcome flow
await loyaltyService.triggerWelcomeFlow(event.email, {
loyaltyId: event.attributes.LOYALTY_ID,
tier: event.attributes.LOYALTY_TIER || 'Bronze',
signupBonus: 500
});
// Award signup bonus
await loyaltyService.awardPoints(event.email, {
amount: 500,
reason: 'Welcome bonus',
type: 'signup_bonus'
});
// Schedule onboarding emails
await loyaltyService.scheduleOnboardingSequence(event.email, {
tier: event.attributes.LOYALTY_TIER,
preferences: event.attributes
});
}
// Track signup source
await loyaltyService.trackSignupSource(event.email, {
lists: event.lists,
attributes: event.attributes,
timestamp: new Date(event.date)
});
}
```
#### contact_updated
Triggered when contact information is updated.
**Payload Example:**
```json
{
"event": "contact_updated",
"email": "customer@example.com",
"date": "2024-01-25 16:45:00",
"ts": 1641003900,
"updated_attributes": {
"LOYALTY_POINTS": 1250,
"LOYALTY_TIER": "Silver",
"TOTAL_SPENT": 899.99
},
"previous_attributes": {
"LOYALTY_POINTS": 750,
"LOYALTY_TIER": "Bronze",
"TOTAL_SPENT": 549.99
}
}
```
**Tajo Integration Use Cases:**
- Detect tier upgrades
- Track point balance changes
- Monitor profile completeness
- Trigger tier-specific campaigns
```javascript
async function handleContactUpdated(event) {
const updated = event.updated_attributes;
const previous = event.previous_attributes;
// Check for tier upgrade
if (updated.LOYALTY_TIER && updated.LOYALTY_TIER !== previous.LOYALTY_TIER) {
await loyaltyService.handleTierUpgrade(event.email, {
previousTier: previous.LOYALTY_TIER,
newTier: updated.LOYALTY_TIER,
pointsBalance: updated.LOYALTY_POINTS
});
// Send congratulations
await loyaltyService.sendTierUpgradeEmail(event.email, {
newTier: updated.LOYALTY_TIER,
benefits: loyaltyService.getTierBenefits(updated.LOYALTY_TIER)
});
}
// Track significant point increases
const pointIncrease = updated.LOYALTY_POINTS - previous.LOYALTY_POINTS;
if (pointIncrease > 0) {
await loyaltyService.trackPointsEarned(event.email, {
amount: pointIncrease,
newTotal: updated.LOYALTY_POINTS,
source: 'profile_update'
});
}
// Monitor spending milestones
if (updated.TOTAL_SPENT > previous.TOTAL_SPENT) {
await loyaltyService.checkSpendingMilestones(event.email, {
currentSpend: updated.TOTAL_SPENT,
previousSpend: previous.TOTAL_SPENT
});
}
}
```
### Event Processing Best Practices
#### 1. Idempotency Handling
```javascript
class WebhookProcessor {
constructor() {
this.processedEvents = new Set();
}
async processEvent(event) {
const eventKey = `${event.event}_${event.email}_${event.ts}`;
if (this.processedEvents.has(eventKey)) {
console.log('Duplicate event ignored:', eventKey);
return;
}
this.processedEvents.add(eventKey);
try {
await this.handleEvent(event);
} catch (error) {
this.processedEvents.delete(eventKey); // Allow retry
throw error;
}
}
}
```
#### 2. Event Sequencing
```javascript
async function processEventInSequence(event) {
const customer = await loyaltyService.getCustomer(event.email);
const lastProcessedTime = customer.lastWebhookProcessed || 0;
// Ensure events are processed in chronological order
if (event.ts < lastProcessedTime) {
console.warn('Out-of-order event received, queuing for later processing');
await loyaltyService.queueEventForLaterProcessing(event);
return;
}
await handleWebhookEvent(event);
// Update last processed timestamp
await loyaltyService.updateCustomer(event.email, {
lastWebhookProcessed: event.ts
});
}
```
#### 3. Batch Processing
```javascript
class BatchEventProcessor {
constructor() {
this.eventBatch = [];
this.batchSize = 100;
this.flushInterval = 5000; // 5 seconds
setInterval(() => this.flushBatch(), this.flushInterval);
}
addEvent(event) {
this.eventBatch.push(event);
if (this.eventBatch.length >= this.batchSize) {
this.flushBatch();
}
}
async flushBatch() {
if (this.eventBatch.length === 0) return;
const batch = this.eventBatch.splice(0);
try {
await loyaltyService.processBatchEvents(batch);
} catch (error) {
console.error('Batch processing failed:', error);
// Re-queue failed events
this.eventBatch.unshift(...batch);
}
}
}
```
### Next Steps
- **Webhook Security Guide** - Security best practices
- **[Testing Webhooks](/docs/testing-debug/)** - Testing and debugging
- **Webhook Analytics** - Performance monitoring
- **[Platform Integration](/docs/platform-integration/tajo-brevo-integration)** - Complete integration guide
### Frequently asked questions
**Which email events can Brevo send by webhook, and when is each triggered?**
delivered when an email reaches the mailbox, opened when the tracking pixel loads, clicked for a link click, bounced for a temporary failure, hard_bounced for a permanent one, spam when the recipient reports the email, and unsubscribed.
**Which SMS events does Brevo send by webhook?**
sms_delivered when the message reaches the phone, sms_failed when delivery fails, and sms_reply when the recipient answers, which lets you handle commands such as STOP or HELP automatically.
**What should I do when a Brevo webhook reports a hard bounce?**
Mark the email invalid, record the bounce reason and date, stop sending to that address, and switch to another channel such as SMS if the contact has one. A soft bounce only increments a counter.
**What should happen when a contact marks my email as spam?**
Stop all email marketing to that contact immediately, record the report date, and review the template and segment it came from. Spam reports are a high-severity signal for sender reputation.
**Which contact events does Brevo send?**
contact_created when a new contact is added, with its lists and attributes, and contact_updated when attributes change, which lets you detect changes such as TOTAL_SPENT crossing a threshold and trigger a campaign.
**How do I process Brevo webhook events reliably?**
Handle events idempotently by message id so retries do not double-count, respect event sequencing with the event timestamp, and batch high-volume events before writing them to your store.
---
## webhooks setup
Source: https://tajo.io/docs/webhooks-setup/
Documentation for webhooks setup
This section is under development. More content coming soon.
---
# Help centre
## Build an Abandoned Cart Recovery Flow
Source: https://tajo.io/resources/help/automation-workflows/abandoned-cart-recovery/
Create a multi-channel cart abandonment flow with Email, SMS, and WhatsApp to recover lost sales
**Recover up to 30% of abandoned carts with a strategic multi-channel flow combining Email, SMS, and WhatsApp.**
### What You'll Build
By the end of this guide, you'll have a complete abandoned cart recovery system that:
- ✅ Detects when customers abandon their cart
- ✅ Sends personalized recovery messages across 3 channels
- ✅ Includes dynamic product images and cart rebuild links
- ✅ Offers strategic incentives to drive conversion
- ✅ Tracks performance and revenue attribution
**Expected Results**: Industry average is 8-15% cart recovery rate. With Tajo's multi-channel approach, many merchants see **20-30% recovery rates**.
---
### Prerequisites
Before building your flow, ensure you have:
- ✅ Tajo connected to Shopify ([Setup guide](/resources/help/#getting-startedconnect-shopify-to-brevo))
- ✅ Brevo account with automation access
- ✅ SMS/WhatsApp consent collection enabled (optional but recommended)
- ✅ At least 50 historical checkouts for testing
- ✅ 30-45 minutes to complete setup
---
### Understanding Cart Abandonment
#### Why Do Customers Abandon Carts?
| Reason | % of Abandoners | Solution |
|--------|----------------|----------|
| **High shipping costs** | 48% | Free shipping threshold |
| **Just browsing/not ready** | 37% | Multi-message nurture sequence |
| **Comparison shopping** | 27% | Urgency (limited stock, time-limited discount) |
| **Complicated checkout** | 24% | Cart rebuild link (one-click return) |
| **Concerns about security** | 18% | Trust badges, testimonials in email |
| **Sticker shock** | 16% | Payment plan options, discount offer |
*Source: Baymard Institute, 2024*
#### The Multi-Channel Advantage
**Single channel (Email only)**: 8-12% recovery rate
**Multi-channel (Email + SMS)**: 15-20% recovery rate
**Tri-channel (Email + SMS + WhatsApp)**: **25-35% recovery rate** ⬅️ Tajo exclusive
**Why WhatsApp works**: 98% open rate vs. 20% for email. Many international customers prefer WhatsApp for shopping conversations.
---
### Step 1: Choose Your Trigger Event
Tajo offers two cart abandonment triggers:
#### Option A: Checkout Started (Recommended)
**When it fires**: Customer enters email/phone at checkout but doesn't complete purchase
**Pros**:
- ✅ Have verified contact info (email + phone)
- ✅ Higher purchase intent
- ✅ Standard industry practice
- ✅ Can include cart rebuild link
**Cons**:
- ❌ Misses early abandoners (add to cart but don't start checkout)
**Best for**: Most stores, especially with multi-step checkout
#### Option B: Cart Created
**When it fires**: Customer adds first item to cart
**Pros**:
- ✅ Catches more abandoners
- ✅ Earlier intervention
- ✅ Can nurture browsers into buyers
**Cons**:
- ❌ May not have contact info yet
- ❌ Lower purchase intent
- ❌ Higher unsubscribe risk if too aggressive
**Best for**: High-ticket items, long consideration cycles (jewelry, furniture, etc.)
**Our Recommendation**: Start with **Checkout Started**. Once optimized, add a separate "Cart Created" browse abandonment flow.
---
### Step 2: Create Your Flow in Brevo
#### 2.1 Access Brevo Automation
1. Log in to **Brevo**
2. Navigate to **Automation > Workflows**
3. Click **Create a Workflow**
4. Select **Start from scratch** (we'll build custom)
#### 2.2 Set Up the Trigger
1. Click **Add trigger**
2. Select **Event** as trigger type
3. Choose event: **`shopify_checkout_started`**
4. Add filter conditions:
- `order_id` **does not exist** (ensures they didn't complete purchase)
- `cart_value` **is greater than** `0` (has items in cart)
- `cart_value` **is less than** `10000` (filter out test orders)
#### 2.3 Add Entry Filters (Important!)
Prevent duplicate messages and respect customer preferences:
1. Click **Add condition** under trigger
2. Add these filters:
- ✅ **Has not placed order** since starting this flow
- ✅ **Is subscribed to email** (if using email channel)
- ✅ **Has not been in this flow** in the last 30 days
- ✅ **Cart value** > your minimum threshold (e.g., $20)
---
### Step 3: Build Your Message Sequence
#### The 3-Message Strategy
**Message 1 (Email)** - Reminder + Soft Sell
- **Timing**: 1 hour after abandonment
- **Goal**: Gentle reminder, remove friction
- **Conversion Rate**: 40-50% of total recoveries
**Message 2 (SMS or WhatsApp)** - Urgency + Incentive
- **Timing**: 6 hours after abandonment (if no purchase from Message 1)
- **Goal**: Create urgency, offer help
- **Conversion Rate**: 30-35% of total recoveries
**Message 3 (Email + Discount)** - Last Chance
- **Timing**: 24 hours after abandonment (if no purchase from Messages 1-2)
- **Goal**: Final incentive, social proof
- **Conversion Rate**: 15-20% of total recoveries
---
### Step 4: Design Message 1 (Email - 1 Hour)
#### 4.1 Add Time Delay
1. After your trigger, click **Add action**
2. Select **Wait**
3. Set duration: **1 hour**
4. Why 1 hour? Gives customer time to return naturally, but not so long they forget
#### 4.2 Add Conditional Check
Before sending, verify they haven't purchased:
1. After wait, click **Add condition**
2. Select **If/Else**
3. Condition: **Has placed order** since starting flow
4. **If yes**: End flow (they purchased!)
5. **If no**: Continue to email
#### 4.3 Design the Email
Click **Add action** > **Send email** > **Create new email**
**Subject Line Options** (A/B test these):
- "You left something behind 🛒"
- "Still thinking about `{{PRODUCT_NAME}}`?"
- "Your cart is waiting for you"
- "Quick question about your order?"
**Email Body Structure**:
```html
You left something in your cart!
Hi `{{FIRSTNAME}}`, we saved your items. Ready to check out?
Questions? Reply to this email or chat with us at tajo.io/chat
```
**Design Tips**:
- Use large, clear product images (at least 300px wide)
- Make CTA button high contrast and above the fold
- Include cart rebuild link (`{{checkout_url}}`) in multiple places
- Add trust badges if you have them
- Mobile-first design (60% open on mobile)
---
### Step 5: Design Message 2 (SMS/WhatsApp - 6 Hours)
#### 5.1 Add Time Delay & Condition
1. Add **Wait** action: **5 hours** (total 6 hours from abandonment)
2. Add **If/Else** condition: Has placed order?
- If yes → End flow
- If no → Continue
#### 5.2 Choose Channel: SMS or WhatsApp?
**Use SMS if**:
- Customer is in US/Canada
- You have SMS consent
- Short, direct message needed
**Use WhatsApp if**:
- Customer is international
- You have WhatsApp consent
- You want to include rich media (images, carousel)
**Use Both** (recommended):
- Add condition: **If has WhatsApp consent** → Send WhatsApp
- **Else if has SMS consent** → Send SMS
- **Else** → Skip this message
#### 5.3 SMS Message Template
```
Hi `{{FIRSTNAME}}`! 👋
Your cart is waiting:
{{PRODUCT_NAME}} - $`{{CART_TOTAL}}`
Only `{{INVENTORY_COUNT}}` left in stock!
Complete checkout: `{{SHORT_LINK}}`
Questions? Reply to this message.
Reply STOP to opt-out
```
**Character count**: Aim for < 160 characters for single SMS. This example is ~150 chars.
#### 5.4 WhatsApp Message Template (Tajo Exclusive!)
WhatsApp allows richer formatting and media:
```
Hi `{{FIRSTNAME}}`! 👋
I noticed you left some items in your cart:
🛍️ *{{PRODUCT_NAME}}*
💰 $`{{PRODUCT_PRICE}}` x `{{QUANTITY}}`
📦 *Cart Total: $`{{CART_TOTAL}}`*
⚡ *`{{INVENTORY_COUNT}}` left in stock* - Don't miss out!
[Image: `{{PRODUCT_IMAGE}}`]
Complete your order: `{{CHECKOUT_URL}}`
Need help? Just reply to this message!
```
**WhatsApp Advantages**:
- ✅ Can include product image
- ✅ Rich text formatting (bold, italic)
- ✅ Two-way conversation (customer can reply with questions)
- ✅ 98% open rate vs. 20% SMS open rate
- ✅ No character limits (unlike SMS)
---
### Step 6: Design Message 3 (Email - 24 Hours + Discount)
#### 6.1 Add Delay & Condition
1. Add **Wait**: **18 hours** (total 24 hours from abandonment)
2. Add **If/Else**: Has placed order?
- If yes → End flow
- If no → Continue to final email
#### 6.2 Generate Dynamic Discount Code
**Option A: Static Discount** (Simple)
- Use existing Shopify discount code (e.g., "SAVE10")
- Manually insert in email template
**Option B: Unique Discount** (Recommended - Prevents Sharing)
1. In Brevo email editor, click **Add dynamic content**
2. Select **Discount code generator**
3. Configure:
- **Source**: Shopify
- **Discount type**: Percentage or fixed amount
- **Value**: 10% or $10 (test what works for your AOV)
- **Expiration**: 48 hours from send
- **Usage limit**: 1 per customer
4. Insert token: `{{DISCOUNT_CODE}}`
#### 6.3 Final Email Design
**Subject Line** (test these):
- "`{{FIRSTNAME}}`, here's 10% off your cart 🎁"
- "Last chance: Your cart + a special discount"
- "We miss you! Here's 10% off to come back"
- "`{{PRODUCT_NAME}}` + 10% off = 😍"
**Email Body**:
```html
⏰ Your cart expires in 24 hours!
Come back and save 10%!
Hi `{{FIRSTNAME}}`,
We noticed you haven't completed your purchase. As a thank you for considering us, here's a special 10% discount:
{% endfor %}
```
This can increase AOV by 15-30% when customers do convert.
#### Strategy #4: Exit Intent Popup (Prevention)
**Before** carts are abandoned, show exit-intent popup:
1. In Tajo, go to **Forms > Create Popup**
2. Trigger: **Exit intent** (mouse moves to close tab)
3. Offer: "Wait! Here's 10% off if you complete checkout now"
4. Display on: Checkout page only
Prevents 15-20% of abandonments before they happen.
---
### Troubleshooting
#### Flow Not Triggering?
**Check #1**: Verify Shopify connection
- Tajo dashboard > Integrations > Shopify should be ✅ Connected
- Test by creating a cart and checking Tajo > Events
**Check #2**: Review entry filters
- Make sure filters aren't too restrictive
- Test with filter: `cart_value > 1` (allows all carts)
**Check #3**: Verify event tracking
- In Shopify, install Tajo app embed (Online Store > Themes > App embeds)
- Without app embed, checkout events may not fire
#### Customers Not Receiving Emails?
**Check #1**: Verify email subscription status
- Customer must be subscribed to email marketing
- Check in Brevo: Contacts > Search customer > Subscription status
**Check #2**: Check spam folder
- Ask test recipient to check spam/junk
- Add your sending domain to allowlist
**Check #3**: Review send logs
- Brevo > Workflows > Your flow > Logs
- Look for send errors or bounces
#### Discount Codes Not Working?
**Check #1**: Verify Shopify discount settings
- Shopify > Discounts > [Your discount]
- Ensure "Active" and not expired
- Check usage limits
**Check #2**: Test manual application
- Copy discount code from email
- Try applying at Shopify checkout manually
- If works manually, issue is with dynamic insertion
**Check #3**: Check Tajo discount sync
- Tajo > Shopify Settings > Discount sync
- Should be enabled and error-free
---
### FAQ
#### Should I offer a discount in the first email?
**No** (unless very high abandonment rate). Best practice:
- Email 1: Reminder only
- Email 2: Urgency + help offer
- Email 3: Discount as last resort
This maximizes profit by not training customers to wait for discounts.
#### How often can I send cart abandonment emails?
**Industry standard**: 3 emails over 24-48 hours
**Aggressive**: 4-5 emails over 3-7 days
**Conservative**: 2 emails over 24 hours
**Tajo recommendation**: Start with 3 (1hr, 6hr, 24hr). Add more only if metrics support it.
#### Should I use SMS or WhatsApp for Message 2?
**SMS if**:
- Primarily US/Canada customers
- High SMS consent rate
- Need guaranteed delivery
**WhatsApp if**:
- International customer base
- Higher engagement rates desired (98% vs. 80% for SMS)
- Want two-way conversation capability
**Both**:
- Best approach: Send WhatsApp to those with WhatsApp consent, SMS to others
#### Do I need consent for cart abandonment emails?
**Email**: In most countries, cart abandonment is considered transactional (not marketing) if customer entered email at checkout. However, best practice is to only send to subscribed customers.
**SMS**: In US, requires express written consent (TCPA). Checkout entry alone is NOT sufficient.
**WhatsApp**: Requires opt-in consent in all regions.
**Tajo's approach**: We automatically filter to subscribed customers to ensure compliance.
#### What if customer abandoned but has "Accepts Marketing" unchecked?
You have three options:
1. **Don't send** (safest, but loses revenue)
2. **Send first email only** as transactional receipt (gray area)
3. **Use popup at abandonment** to collect consent before sending
**Recommendation**: Option 3 - show exit-intent popup asking "Want us to save your cart and email you?" with checkbox.
---
### Conclusion
You've now built a complete, multi-channel abandoned cart recovery flow that:
✅ Reaches customers via Email, SMS, and WhatsApp
✅ Uses strategic timing (1hr, 6hr, 24hr)
✅ Offers progressive incentives (ending with discount)
✅ Includes dynamic cart rebuild links
✅ Respects customer preferences and compliance
**Expected results**: 20-30% cart recovery rate, translating to thousands in recovered revenue per month.
---
### Next Steps
1. ✅ **Monitor performance** for 2 weeks to establish baseline
2. ✅ **A/B test subject lines** to improve open rates
3. ✅ **Add browse abandonment flow** for early-stage abandoners
4. ✅ **Enable exit-intent popup** to prevent abandonment
5. ✅ **Set up post-purchase flow** to drive repeat purchases
---
### Related Articles
- [Collect SMS & WhatsApp Consent at Checkout](/resources/help/#sms-whatsappcollect-sms-whatsapp-consent)
- [Understanding Shopify Data Sync](/resources/help/#getting-startedunderstanding-data-sync)
- [Create Dynamic Discount Codes](/resources/help/#email-marketingdynamic-discount-codes)
- [Set Up WhatsApp Order Notifications](/resources/help/#sms-whatsappwhatsapp-order-notifications)
---
**Questions?** Reach out to help@tajo.io or chat with us in the Tajo dashboard!
*Last updated: January 22, 2025*
### Frequently asked questions
**How do I set up abandoned cart recovery with Shopify and Brevo?**
In Brevo, go to Automation > Workflows, create a workflow from scratch, set the trigger to the event shopify_checkout_started with filters that order_id does not exist and cart_value is above 0, add entry filters against duplicates, then build three messages: an email at 1 hour, SMS or WhatsApp at 6 hours, and an email with a discount at 24 hours.
**Which trigger should I use for an abandoned cart flow?**
Checkout Started. It fires when a customer enters an email or phone at checkout but does not buy, so you have verified contact details and higher intent. Cart Created catches earlier abandoners but often has no contact info; add it later as a separate browse-abandonment flow for high-ticket items.
**How many messages should a cart recovery flow have, and when do they go out?**
Three over 24 hours: a reminder email at 1 hour, an SMS or WhatsApp message with urgency at 6 hours if they have not bought, and a last-chance email with a discount at 24 hours. Add more only if your metrics support it.
**Should I offer a discount in the first abandoned cart email?**
No, unless your abandonment rate is very high. Send a reminder first, urgency and an offer of help second, and keep the discount for the third message. Discounting first trains customers to wait for deals.
**Do I need consent to send abandoned cart messages?**
For email, most countries treat cart abandonment as transactional when the customer entered their email at checkout, but only sending to subscribed contacts is best practice. For SMS in the US, TCPA requires express written consent; a checkout entry alone is not enough.
**What recovery rate can an abandoned cart flow reach?**
Industry average is 8 to 15 percent. Email alone recovers 8 to 12 percent, email plus SMS 15 to 20 percent, and email, SMS and WhatsApp together 25 to 35 percent. WhatsApp has a 98 percent open rate against about 20 percent for email.
---
## Build a Post-Purchase Flow for Shopify Customers
Source: https://tajo.io/resources/help/automation-workflows/post-purchase-flow/
Create a multi-channel post-purchase automation in Brevo using Tajo's Shopify order events to confirm, update, cross-sell, and request reviews.
**The moments right after a purchase are your highest-engagement window. A well-built post-purchase flow turns one-time buyers into repeat customers.**
> **Quick check**
> You need a connected Shopify store syncing to Brevo through Tajo with order events enabled (**Order Placed**, **Order Fulfilled**, **Order Delivered**). Confirm in **Tajo > Sync Status** that recent test orders appear as events before building.
### What This Flow Does
A post-purchase flow runs automatically when someone buys, then guides them through delivery and toward a second purchase across email and optionally WhatsApp.
| Stage | Trigger | Channel | Goal |
|-------|---------|---------|------|
| Confirmation | Order Placed | Email or WhatsApp | Reassure, set expectations |
| Shipping update | Order Fulfilled | Email or WhatsApp | Reduce "where is my order" tickets |
| Delivery follow-up | Order Delivered | Email | Confirm satisfaction |
| Review request | 3 days after delivery | Email | Generate social proof |
| Cross-sell | 7 days after delivery | Email | Drive the second order |
### Step 1: Create the Automation
1. Open **Brevo > Automations** and click **Create automation**.
2. Choose **Custom automation**.
3. Set the entry trigger to the Tajo event **Order Placed**.
### Step 2: Send the Confirmation
1. Add a **Send email** step immediately after the trigger.
2. Use a branded template. See [email templates and branding](/resources/help/email-marketing/email-templates-and-branding/).
3. Personalize with synced order data: order number, items, total, and store name.
4. Optionally add a **Send WhatsApp** step using an approved Utility template. See [WhatsApp template approval](/resources/help/sms-whatsapp/whatsapp-template-approval/).
### Step 3: Add the Shipping Update
1. Add a **Wait** step set to "until event".
2. Wait for the Tajo event **Order Fulfilled**.
3. Send an email or WhatsApp message with the tracking link from the synced order.
This single message removes a large share of support requests.
### Step 4: Delivery Follow-Up and Review Request
1. Add a wait for the **Order Delivered** event.
2. Send a short "How did it go?" email.
3. Add a **Wait 3 days** step.
4. Send a review request linking to your product review tool.
> **Tip**
> Only ask for a review after **Order Delivered**, never after **Order Placed**. Asking before the customer has the product is the most common reason post-purchase flows annoy people and earn unsubscribes.
### Step 5: Cross-Sell the Second Purchase
1. Add a **Wait 7 days** step after delivery.
2. Send an email with a Tajo product block set to "related to last purchase". It pulls live images and prices from synced Shopify products.
3. Optionally include a small returning-customer incentive linked to your [loyalty program](/resources/help/loyalty/set-up-loyalty-program/).
### Step 6: Add Exit and Suppression Logic
- **Exclude** anyone without marketing consent from the review and cross-sell steps. Confirmation and shipping updates are transactional and may still be sent.
- Add an exit condition so a customer who places a new order does not receive a stale cross-sell from the old one.
- Cap frequency so a customer with several orders in one week is not flooded.
### Step 7: Test End to End
1. Place a test order with a fresh email address.
2. Confirm the confirmation message arrives within about a minute.
3. Mark the order fulfilled and then delivered in Shopify.
4. Confirm each stage fires in order in the Brevo automation log.
### Measuring Success
Track these per step in Brevo: open rate, click rate, and revenue attributed to the cross-sell email. A healthy post-purchase flow lifts repeat purchase rate within the first 30 days after delivery.
### Related Articles
- [Win back lapsed customers](/resources/help/automation-workflows/win-back-lapsed-customers/)
- [Email templates and branding](/resources/help/email-marketing/email-templates-and-branding/)
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Set up a loyalty program](/resources/help/loyalty/set-up-loyalty-program/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**What should a post-purchase email flow include?**
Five stages: a confirmation on Order Placed, a shipping update on Order Fulfilled, a delivery follow-up on Order Delivered, a review request 3 days after delivery, and a cross-sell 7 days after delivery. Confirmation and shipping can go by email or WhatsApp.
**How do I build a post-purchase automation in Brevo with Tajo?**
In Brevo > Automations create a custom automation with the Tajo event Order Placed as the entry trigger, send a branded confirmation, then add wait-until-event steps for Order Fulfilled and Order Delivered, each followed by its message, and finish with the review request and cross-sell waits.
**When should I ask a customer for a product review?**
Only after Order Delivered, never after Order Placed. Asking before the customer has the product is the most common reason post-purchase flows annoy people and earn unsubscribes. Wait 3 days after delivery, then send the request.
**Can I send post-purchase messages to customers without marketing consent?**
Confirmation and shipping updates are transactional and may still be sent. Exclude anyone without marketing consent from the review and cross-sell steps.
**How do I test a post-purchase flow end to end?**
Place a test order with a fresh email address, confirm the confirmation arrives, mark the order fulfilled and then delivered in Shopify, and confirm each stage fires in order in the Brevo automation log.
**Which order events do I need for a post-purchase flow?**
Order Placed, Order Fulfilled and Order Delivered, synced from your connected Shopify store to Brevo through Tajo. Confirm recent test orders appear as events before building.
---
## Set Up a Welcome Series
Source: https://tajo.io/resources/help/automation-workflows/welcome-series-setup/
Build an automated welcome series in Brevo triggered by new Shopify customers synced through Tajo.
**A welcome series is the highest-ROI automation you can run. It greets new customers automatically and drives the critical second purchase.**
> **Prerequisites**
> - ✅ Shopify connected and syncing ([setup](/resources/help/getting-started/connect-shopify-to-brevo/))
> - ✅ Sender domain authenticated in Brevo
### The Structure That Works
A simple three-email series outperforms a complex one:
1. **Immediately**: welcome and set expectations. Welcome emails have far higher open rates than regular campaigns, so put your best foot forward.
2. **Day 2**: brand story or best-selling products. Build trust.
3. **Day 4 to 5**: a reason to come back (helpful content or a first-order incentive).
### Step 1: Create the Automation
In Brevo, go to **Automations > Create automation > From scratch**.
### Step 2: Set the Trigger
Use a contact-added or first-order trigger. Because Tajo syncs new Shopify customers into Brevo in near real time, new buyers enter the series automatically without manual list management.
### Step 3: Build the Emails
Add a wait step between each email. Personalize with synced Shopify fields (first name, first product). Keep one clear call to action per email.
### Step 4: Add an Exit Condition
Exit contacts who place another order so they do not receive "come back" messaging after they already returned. This is where synced order data matters.
### Step 5: Test and Activate
Run the automation in test mode with a sample contact, confirm timing and personalization, then activate.
### Measuring Success
Track series completion rate and, more importantly, the share of recipients who place a second order during the series. Iterate on the weakest email first.
Next: [post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/) and [abandoned cart recovery](/resources/help/automation-workflows/abandoned-cart-recovery/).
### Frequently asked questions
**How many emails should a welcome series have?**
Three. A simple three-email series outperforms a complex one: a welcome that sets expectations immediately, a brand story or best sellers on day 2, and a reason to come back on day 4 to 5, such as helpful content or a first-order incentive.
**How do I set up a welcome series in Brevo for new Shopify customers?**
In Brevo go to Automations > Create automation > From scratch, set a contact-added or first-order trigger, add the three emails with a wait step between each, add an exit condition for contacts who order again, then test with a sample contact and activate.
**How do new Shopify customers enter the welcome automation?**
Through a contact-added or first-order trigger. Tajo syncs new Shopify customers into Brevo, so new buyers enter the series automatically without manual list management.
**Why add an exit condition to a welcome series?**
So contacts who place another order stop receiving come-back messaging after they have already returned. Synced order data is what makes that exit possible.
**How do I measure whether my welcome series works?**
Track the series completion rate and, more importantly, the share of recipients who place a second order during the series. Iterate on the weakest email first.
---
## Win Back Lapsed Customers With an Automated Flow
Source: https://tajo.io/resources/help/automation-workflows/win-back-lapsed-customers/
Re-engage customers who stopped buying using a Brevo win-back automation powered by Tajo's synced Shopify order history.
**Reactivating a past customer is far cheaper than acquiring a new one. This flow automatically detects lapsed buyers and pulls them back before they churn for good.**
> **Quick check**
> You need a connected Shopify store syncing order history to Brevo through Tajo and Editor access or higher. Confirm `LAST_ORDER_DATE` and `TOTAL_ORDERS` are populated on contacts in Brevo before building.
### Define "Lapsed" for Your Store
"Lapsed" depends on how often customers normally buy. Use your typical purchase cycle:
| Store type | Typical reorder | Treat as lapsed after |
|------------|-----------------|------------------------|
| Consumables (coffee, supplements) | 30 to 45 days | 60 days |
| Apparel and general retail | 60 to 90 days | 120 days |
| High-ticket or seasonal | 6 to 12 months | 9 to 12 months |
Pick a threshold and keep it consistent so the flow triggers predictably.
### Step 1: Build the Lapsed Segment
1. In **Brevo > Contacts > Segments**, create a dynamic segment.
2. Conditions:
- `TOTAL_ORDERS` is 1 or more
- `LAST_ORDER_DATE` is more than your threshold ago
- Marketing consent is yes
3. Save it as "Lapsed customers". See [segmentation basics](/resources/help/email-marketing/segmentation-basics/) for more.
### Step 2: Create the Automation
1. Open **Brevo > Automations** and create a custom automation.
2. Set the trigger to **contact enters segment** "Lapsed customers".
Because the segment is dynamic and fed by Tajo's synced order data, customers enter the flow automatically the day they cross your threshold.
### Step 3: Build the Message Sequence
A three-message sequence works well. Escalate the incentive only if earlier, cheaper messages do not work.
| Message | Timing | Content | Incentive |
|---------|--------|---------|-----------|
| 1. We miss you | Day 0 | Friendly check-in, best sellers | None |
| 2. Here is something for you | Day 4 | Reminder plus social proof | Small discount or free shipping |
| 3. Last call | Day 9 | Urgency, expiring offer | Best offer, time-limited |
Sending the discount first trains customers to wait for deals, so lead with the no-incentive message.
### Step 4: Personalize With Synced Data
- Reference `LAST_PRODUCT_PURCHASED` to recommend a related item using a Tajo product block.
- Greet by first name with a fallback.
- For multi-store accounts, use `STORE_NAME` so the message reflects the correct brand.
> **Tip**
> Generate the discount as a unique, single-use code rather than a public coupon. This stops the offer from spreading and prevents customers who never lapsed from claiming it.
### Step 5: Add Exit Conditions
This step is what makes the flow feel intelligent.
- Exit the moment the customer places an order. Tajo's **Order Placed** event removes them so they never receive "last call" after buying.
- Suppress anyone who unsubscribes or whose consent is withdrawn.
- Do not re-enter a customer who recently completed the flow; add a re-entry cooldown.
### Step 6: Test the Flow
1. Set a test contact's `LAST_ORDER_DATE` past the threshold so they enter the segment.
2. Confirm message 1 sends.
3. Place a test order for that contact and confirm they exit before message 2.
### Measuring Success
Track reactivation rate (share of lapsed contacts who buy during the flow) and revenue per recipient. Compare incentive cost against recovered revenue. Tighten the threshold or trim the discount if margins are thin.
### Pair It With Loyalty
A win-back offer combined with loyalty points often outperforms a discount alone. See [set up a loyalty program](/resources/help/loyalty/set-up-loyalty-program/) and [points and rewards rules](/resources/help/loyalty/points-and-rewards-rules/).
### Related Articles
- [Build a post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/)
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Set up a loyalty program](/resources/help/loyalty/set-up-loyalty-program/)
- [Email templates and branding](/resources/help/email-marketing/email-templates-and-branding/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**When should a customer count as lapsed?**
It depends on your reorder cycle. Treat consumables such as coffee or supplements as lapsed after 60 days, apparel and general retail after 120 days, and high-ticket or seasonal goods after 9 to 12 months. Pick one threshold and keep it consistent.
**How do I build a lapsed customer segment in Brevo?**
In Brevo > Contacts > Segments create a dynamic segment with three conditions: TOTAL_ORDERS is 1 or more, LAST_ORDER_DATE is more than your threshold ago, and marketing consent is yes. Save it as Lapsed customers.
**What messages should a win-back sequence include?**
Three messages: a friendly no-incentive check-in with best sellers on day 0, a reminder with social proof and a small discount or free shipping on day 4, and a time-limited best offer on day 9. Lead without a discount, or you train customers to wait for deals.
**How do I stop win-back emails after a customer orders again?**
Add an exit condition on the Tajo Order Placed event, which removes the customer the moment they buy. Also suppress anyone who unsubscribes and add a re-entry cooldown so recent completers are not re-enrolled.
**How do I trigger a win-back automation automatically?**
Set the automation trigger to contact enters segment Lapsed customers. Because the segment is dynamic and fed by order data Tajo syncs, customers enter the flow the day they cross your threshold.
**Should win-back discounts be public coupons?**
No. Generate a unique, single-use code. That stops the offer spreading and prevents customers who never lapsed from claiming it.
---
## Email Templates and Branding for Shopify Stores
Source: https://tajo.io/resources/help/email-marketing/email-templates-and-branding/
Build on-brand Brevo email templates that pull live Shopify product and order data through Tajo, so every campaign looks consistent and converts.
**Create a reusable, on-brand email template that automatically shows the right product images, prices, and store name pulled from your Shopify data.**
> **Quick check**
> You need a connected Shopify store syncing to Brevo through Tajo and Editor access or higher. Have your logo (PNG with transparent background), brand colors (hex codes), and brand font name ready before you start.
### Step 1: Set Brand Defaults Once
Setting brand defaults means you do not re-style every email by hand.
1. Open **Brevo > Campaigns > Templates**.
2. Click **New template** and choose the drag-and-drop editor.
3. In the editor, open **Settings** and set:
- Background and content colors using your brand hex codes
- Default heading and body fonts
- Link color
4. Save this as a starter template named "Brand Base".
Duplicate "Brand Base" whenever you build a new campaign so styling stays consistent.
### Step 2: Add Your Logo and Header
1. Drag an **Image** block to the top.
2. Upload your logo. Keep it under 200 KB and around 600 px wide for crisp display on retina screens.
3. Link the logo to your store homepage.
4. Add a thin spacer or divider below for breathing room.
### Step 3: Insert Live Shopify Data With Tajo Attributes
Tajo syncs Shopify data into Brevo as contact attributes and product data you can reference in templates. Use personalization tags so one template adapts per recipient.
| Goal | What to insert | Notes |
|------|----------------|-------|
| Greet by name | `{{ contact.FIRSTNAME }}` | Add a fallback like "there" |
| Show store name | `{{ contact.STORE_NAME }}` | Useful in multi-store setups |
| Recommended products | Tajo product block | Pulls live image, title, price |
| Last order total | `{{ contact.LAST_ORDER_VALUE }}` | Synced from Shopify |
Always set a fallback value for every personalization tag so an email never renders "Hi ,".
### Step 4: Add a Product Block
1. Drag the **Tajo product recommendation** block into the body.
2. Choose a strategy: best sellers, recently viewed, or related to last purchase.
3. The block renders live product image, title, price, and a button linking to the Shopify product page.
Because the data is synced from Shopify, prices and images stay current without manual updates.
### Step 5: Footer, Compliance, and Sender Identity
Every marketing email must include:
- A working **unsubscribe** link (Brevo inserts this automatically; do not remove it)
- Your business postal address
- Your store name and a reply-to address you monitor
Bulk senders to Gmail and Yahoo must authenticate their sending domain with SPF, DKIM, and DMARC, keep spam complaints under 0.3 percent, and provide one-click unsubscribe. Authenticate your domain in **Brevo > Senders, Domains & Dedicated IPs** before sending volume. See [improve deliverability](/resources/help/email-marketing/improve-deliverability/) for the full checklist.
> **Tip**
> Send the test version to a Gmail address and a mobile device. Roughly two-thirds of opens happen on phones, so confirm the logo, buttons, and product images scale down cleanly.
### Step 6: Save and Reuse
1. Name the finished template clearly (for example, "Promo - Brand 2026").
2. Save it to your template library.
3. When building a campaign or [automation](/resources/help/automation-workflows/post-purchase-flow/), start from this template instead of a blank canvas.
### Keeping Branding Consistent
- Limit yourself to two fonts and three colors.
- Keep one primary call-to-action button style and reuse it everywhere.
- Re-export the "Brand Base" template after any rebrand so all new campaigns inherit the change.
### Related Articles
- [Improve email deliverability](/resources/help/email-marketing/improve-deliverability/)
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Build a post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/)
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**How do I create a branded email template in Brevo?**
In Brevo open Campaigns > Templates, click New template, choose the drag-and-drop editor and set background and content colors, heading and body fonts and link color in Settings. Save it as a starter named Brand Base and duplicate it for every new campaign.
**How do I put Shopify data into Brevo email templates?**
Use personalization tags on the attributes Tajo syncs from Shopify, such as contact.FIRSTNAME, contact.STORE_NAME and contact.LAST_ORDER_VALUE. Always set a fallback value for every tag so an email never renders Hi with an empty name.
**What size should my email logo be?**
Under 200 KB and around 600 px wide for crisp display on retina screens. Link the logo to your store homepage and add a thin spacer below it.
**What must every marketing email include?**
A working unsubscribe link, which Brevo inserts automatically, your business postal address, and your store name with a reply-to address you monitor. Bulk senders to Gmail and Yahoo also need SPF, DKIM and DMARC, complaints under 0.3 percent and one-click unsubscribe.
**How do I keep email branding consistent across campaigns?**
Limit yourself to two fonts and three colors, keep one primary call-to-action button style, and re-export the Brand Base template after any rebrand so new campaigns inherit the change.
**Why should I test my email on a phone before sending?**
Roughly two-thirds of opens happen on phones. Send the test to a Gmail address and a mobile device and confirm the logo, buttons and product images scale down cleanly.
---
## Improve Email Deliverability
Source: https://tajo.io/resources/help/email-marketing/improve-deliverability/
A practical 2026 checklist to keep campaigns sent through Brevo and Tajo landing in the inbox: authentication, list hygiene, reputation, and engagement.
**Deliverability is earned, not configured once. This checklist keeps your sender reputation strong over time.**
### Authenticate Everything
Set up SPF, DKIM, and DMARC on your sending domain in Brevo, with DMARC aligned to your From domain. Send from a branded domain, never a free mailbox. This is the non-negotiable foundation.
### Protect Sender Reputation
- Warm up new domains and IPs gradually.
- Keep sending volume and cadence consistent. Reputation rewards predictability.
- Keep spam complaints under 0.3% and bounces low.
### Keep the List Clean
- Use confirmed or genuine opt-in only. Never buy lists.
- Remove hard bounces immediately and permanently.
- Apply a sunset policy: stop mailing contacts inactive for 6 to 12 months, or move them to a re-engagement flow first.
### Send to Engaged People
Inbox providers weigh engagement heavily. Because Tajo syncs real Shopify purchase and browsing data into Brevo, you can target buyers and recent visitors instead of the entire list. Smaller, engaged sends outperform large cold ones.
### Optimize Content and Cadence
- One clear purpose and call to action per email.
- Balanced text-to-image ratio, working links, no spam-trigger subject lines.
- A predictable schedule beats sporadic large blasts.
### Monitor and React
Track delivery, open, complaint, and bounce rates per campaign. A sudden drop usually means an authentication change or a list-quality problem. Check your domain and IP against major blocklists if placement falls.
### Deliverability Checklist
- ✅ SPF, DKIM, DMARC verified and aligned
- ✅ Branded From domain
- ✅ One-click unsubscribe present
- ✅ Bounces and complaints under control
- ✅ Sunset policy active
- ✅ Sending to engaged segments
- ✅ Consistent volume and cadence
If mail is already filtered, start with [emails going to spam](/resources/help/troubleshooting/emails-going-to-spam/).
### Frequently asked questions
**How do I stop my Brevo campaigns landing in spam?**
Authenticate with SPF, DKIM and DMARC aligned to a branded From domain, warm up new domains gradually, keep volume and cadence consistent, send only to genuine opt-ins, remove hard bounces, and target engaged buyers rather than the entire list.
**What spam complaint rate is acceptable?**
Keep spam complaints under 0.3% and bounces low. Warm up new domains and IPs gradually and keep sending volume predictable; reputation rewards consistency.
**What is a sunset policy for inactive email contacts?**
Stop mailing contacts who have been inactive for 6 to 12 months, or move them to a re-engagement flow first. Remove hard bounces immediately and permanently.
**Why should I send to segments instead of my whole list?**
Inbox providers weigh engagement heavily. Because Tajo syncs real Shopify purchase data into Brevo, you can target buyers and recent customers instead of everyone. Smaller, engaged sends outperform large cold ones.
**What is on the email deliverability checklist?**
SPF, DKIM and DMARC verified and aligned; a branded From domain; one-click unsubscribe present; bounces and complaints under control; an active sunset policy; sending to engaged segments; consistent volume and cadence.
**What does a sudden drop in email deliverability usually mean?**
An authentication change or a list-quality problem. Track delivery, open, complaint and bounce rates per campaign, and check your domain and IP against major blocklists if placement falls.
---
## Segmentation Basics: Target the Right Shopify Customers
Source: https://tajo.io/resources/help/email-marketing/segmentation-basics/
Use Tajo-synced Shopify data to build Brevo segments by purchase behavior, value, and engagement so every campaign reaches the right audience.
**Stop emailing everyone the same message. Build a few high-value segments from your synced Shopify data and watch engagement and revenue per send climb.**
> **Quick check**
> You need a connected Shopify store actively syncing to Brevo through Tajo. Confirm in **Tajo > Sync Status** that customers and orders are current before building segments, otherwise conditions will use stale data.
### Why Segmentation Matters With Brevo Pricing
Brevo bills per email or message sent, not per stored contact. Sending a relevant offer to a 2,000-person segment costs far less and converts far better than blasting 40,000 contacts. Tight segments protect both budget and sender reputation.
### What Tajo Syncs You Can Segment On
Tajo pushes Shopify data into Brevo as contact attributes and events. Common fields:
| Attribute | Example use |
|-----------|-------------|
| `LAST_ORDER_DATE` | Find lapsed customers |
| `TOTAL_ORDERS` | Identify repeat buyers |
| `TOTAL_SPENT` | Build a VIP segment |
| `LAST_PRODUCT_PURCHASED` | Cross-sell related items |
| `STORE_ID` / `STORE_NAME` | Separate audiences in multi-store setups |
| Marketing consent | Respect email and SMS opt-in status |
### Step 1: Open the Segment Builder
1. In **Brevo > Contacts > Segments**, click **Create a segment**.
2. Pick the list synced from Shopify by Tajo.
3. Add one or more conditions using the attributes above.
### Step 2: Build Five Starter Segments
These five cover most stores. Build them once and reuse them.
| Segment | Conditions |
|---------|-----------|
| **New subscribers** | `TOTAL_ORDERS` equals 0 and consent is yes |
| **First-time buyers** | `TOTAL_ORDERS` equals 1 |
| **Repeat customers** | `TOTAL_ORDERS` is 2 or more |
| **VIPs** | `TOTAL_SPENT` above your top 10 percent threshold |
| **Lapsed** | `LAST_ORDER_DATE` more than 90 days ago |
### Step 3: Combine Conditions With AND / OR
- Use **AND** to narrow (for example, VIP **and** lapsed = high-value win-back).
- Use **OR** to widen (for example, bought product A **or** product B).
Start narrow. A precise 500-person segment usually beats a loose 5,000-person one.
> **Tip**
> Always add the marketing consent condition to every promotional segment. A contact synced from Shopify is not automatically opted in to marketing just because they ordered.
### Step 4: Save Static vs. Dynamic Segments
- **Dynamic segment**: re-evaluated every time you send, so it always reflects current synced data. Use this for behavior-based audiences.
- **Static list**: a frozen snapshot. Use this only for one-time exports or fixed groups.
For Shopify-driven marketing, prefer dynamic segments so new orders synced by Tajo automatically move contacts in and out.
### Step 5: Put Segments to Work
- Send the **VIP** segment early access and higher rewards. Pair with your [loyalty program](/resources/help/loyalty/set-up-loyalty-program/).
- Send the **Lapsed** segment a win-back offer. See [win back lapsed customers](/resources/help/automation-workflows/win-back-lapsed-customers/).
- Exclude **recent buyers** from prospecting campaigns to avoid promoting something they just bought.
### Common Mistakes to Avoid
- Sending to the full list instead of a segment. This hurts deliverability and wastes send volume.
- Forgetting the consent condition.
- Building static segments for behavior that changes daily.
- Over-segmenting until audiences are too small to be statistically useful.
### Related Articles
- [Email templates and branding](/resources/help/email-marketing/email-templates-and-branding/)
- [Improve email deliverability](/resources/help/email-marketing/improve-deliverability/)
- [Win back lapsed customers](/resources/help/automation-workflows/win-back-lapsed-customers/)
- [Set up a loyalty program](/resources/help/loyalty/set-up-loyalty-program/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Which Shopify attributes can I segment on in Brevo?**
Tajo pushes Shopify data into Brevo as contact attributes: LAST_ORDER_DATE to find lapsed customers, TOTAL_ORDERS for repeat buyers, TOTAL_SPENT for a VIP segment, LAST_PRODUCT_PURCHASED for cross-sell, STORE_ID and STORE_NAME for multi-store setups, and marketing consent.
**What starter segments should I build for my Shopify store?**
Five: new subscribers with TOTAL_ORDERS equal to 0 and consent yes, first-time buyers with TOTAL_ORDERS equal to 1, repeat customers with 2 or more orders, VIPs above your top 10 percent TOTAL_SPENT threshold, and lapsed customers whose LAST_ORDER_DATE is more than 90 days ago.
**How do I create a segment in Brevo from synced Shopify data?**
In Brevo go to Contacts > Segments, click Create a segment, pick the list synced from Shopify by Tajo, and add conditions on the synced attributes. Confirm in Tajo that customers and orders are current first, or the conditions use stale data.
**Should I use dynamic or static segments for Shopify data?**
Dynamic. A dynamic segment is re-evaluated every time you send, so new orders synced by Tajo move contacts in and out automatically. A static list is a frozen snapshot, useful only for one-time exports or fixed groups.
**Is a Shopify customer automatically opted in to marketing emails?**
No. A contact synced from Shopify is not opted in to marketing just because they ordered. Add the marketing consent condition to every promotional segment.
---
## Account Setup and Team Roles in Tajo
Source: https://tajo.io/resources/help/getting-started/account-setup-and-roles/
Set up your Tajo workspace, invite teammates as owners or members, and know what each role can change.
**Set up your workspace and invite your team before you connect Shopify. Tajo has two roles, owner and member, and this page covers what each can do.**
> **Quick check**
> Only an owner can invite teammates or change workspace settings.
### Step 1: Sign In
You sign in to Tajo with Google or with an email and password. If you forget your password, reset it from the sign-in page.
Tajo does not offer two-factor authentication. Use a unique, strong password, or sign in with a Google account that has two-step verification turned on.
### Step 2: Complete Your Workspace Settings
1. Open **Settings**.
2. Under **Workspace**, set the **Name** (usually your store or company name).
3. Set the **Monthly budget (USD)**.
4. Choose whether to **Require approval before publishing**.
5. Click **Save**.
Only owners can edit these settings. Members see them read-only.
### Step 3: Invite Your Team
1. An owner opens **Settings** and goes to **Members**.
2. Enter the teammate's email address.
3. Choose a role: **member** or **owner**.
4. Click **Send invite**. The emailed link expires after 7 days.
Pending invites are listed under the form with their role and expiry. An owner can **Revoke** a pending invite.
### Roles Explained
| Role | Can do | Cannot do |
|------|--------|-----------|
| **Owner** | Change workspace settings, invite people as members or owners, revoke pending invites | (no restrictions in Settings) |
| **Member** | See the members list and workspace settings | Change workspace settings, invite people |
> **Tip**
> Give agencies and freelancers the **member** role. Owners keep control of the budget and of publish approval.
### Changing Roles, Removing Members and Ownership
Settings has no control to change a member's role, remove a member, or transfer ownership. A role is set when the invite is sent. To make someone an owner, send them an owner invite; a workspace can have more than one owner.
### Next Steps
With your team invited, connect your store and start syncing data:
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
- [Understanding Shopify data sync](/resources/help/getting-started/understanding-data-sync/)
- [Set up your Brevo API key](/resources/help/integrations/brevo-api-key-setup/)
### Frequently asked questions
**What roles are there in Tajo and what can each do?**
Two: owner and member. Owners can change the workspace settings, including the monthly budget and whether publishing needs approval, and can invite and revoke invites. Members see the workspace settings read-only and cannot invite anyone.
**How do I invite a teammate to my Tajo workspace?**
An owner opens Settings, enters the teammate's email under Members, picks member or owner, and clicks Send invite. The emailed link expires after 7 days. Pending invites are listed under the form with their role and expiry until they are accepted.
**Can I transfer ownership of my Tajo workspace?**
There is no transfer step. An owner can invite another person as an owner, so a workspace can have more than one owner.
**Which role should I give an agency or freelancer in Tajo?**
Member. Members cannot change workspace settings or invite people, so control of the budget and publish approval stays with your owners.
**Can I change a member's role or remove a member in Tajo?**
Not from Settings today. A role is set when the invite is sent. To give someone the owner role, send them an owner invite.
**Does Tajo support two-factor authentication?**
No. You sign in with Google or with an email and password. Use a unique, strong password, or sign in with a Google account that has two-step verification turned on.
---
## Connect Tajo to Shopify - Complete Setup Guide
Source: https://tajo.io/resources/help/getting-started/connect-shopify-to-brevo/
Connect your Shopify store and Brevo account, review the integration Tajo drafts for you, and approve it so governed syncing can start.
**Tajo connects your Shopify store to Brevo by drafting the integration for you, then waiting for you to review and approve it before anything runs. This guide walks through the full lifecycle: connect both accounts, review the draft, approve it, and let the governed sync take over.**
> **Quick check**
> Tajo is in early access. You need Shopify admin access, a Brevo account, and a Tajo account. Nothing is published or sent until a person on your team approves it, so plan for a short review step. This is by design, not a delay to work around.
### How the Setup Works
Setup is not a single "connect" button. It follows five stages:
1. **Connect** your Shopify store and Brevo account.
2. **Draft**: Tajo drafts the integration — which records move, how fields map, and what gets filtered out.
3. **Review**: you inspect the draft and the preview evidence built for it.
4. **Approve**: a person on your team approves the publication with a written rationale.
5. **Run**: the approved sync runs on a schedule (or on demand), with every run logged.
Expect the connection steps to take a few minutes each and the review to take as long as you want to spend on it. Data starts moving after approval, not before.
### Step 1: Connect Your Shopify Store
1. In Tajo, open **Connectors**.
2. Choose Shopify and authorize access to your store. You will be sent to Shopify to grant permission and returned to Tajo.
3. Tajo requests read access to customers, orders and products, and write access to customers for a few specific writes such as consent opt-outs and loyalty tier tags. See [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/) for every scope and every write.
4. Once connected, Shopify appears on the Connectors page with its connection status.
### Step 2: Connect Your Brevo Account
1. Still in **Connectors**, connect Brevo using your Brevo API key. See [Brevo API key setup](/resources/help/integrations/brevo-api-key-setup/) for how to create one with the right scopes.
2. Once connected, Brevo appears alongside Shopify with its status.
Both connections must be healthy before a sync can be drafted against them.
### Step 3: Let Tajo Draft the Integration
1. Open **Connectors > Syncs** and create a new sync.
2. Pick a template for your source — for example, Shopify customers into Brevo contacts. Instantiating a template copies a full field mapping into a **draft** sync rule you can edit.
3. Open the draft. You can see and change:
- **Field mapping** — each source field, the Brevo field it writes to, and any transform applied.
- **Filter expression** — evaluated per record; records that do not match are skipped.
A draft does nothing on its own. No data moves while a rule is in draft.
### Step 4: Request Publish Approval
1. On the sync rule page, choose **Request publish approval**.
2. Tajo builds a preview of what the rule would do, with supporting evidence, and creates an approval request.
3. The request appears in **Approvals**, where anyone on your team with the right access can pick it up.
The approval is bound to the exact version of the rule you submitted. If the rule is edited after approval, the approval is invalidated and you must request a new one — an approved "yes" can never be reused for a different configuration.
### Step 5: Review and Approve
1. Open the request from the **Approvals** page.
2. Review the rule's configuration and the preview evidence. Sample data shown for review is redacted — reviewers see the shape of what will be written, not raw personal data.
3. Approve or reject. Publication approvals require a short written rationale, and they cannot be batch-approved — each one is an individual decision that is recorded.
Every decision, including who made it and why, lands in the audit trail.
### Step 6: Publish and Let the Sync Run
1. Back on the sync rule, choose **Publish approved version**. The rule becomes **active**.
2. The sync now runs on a schedule, or on demand when you trigger a run yourself.
3. On the rule's page you can watch:
- **Run history** — each run with records read, written, and failed, plus duration.
- **Cursor** — where incremental syncing has progressed to, so runs pick up where the last one left off.
#### What to expect from sync timing
The Tajo Shopify app processes Shopify webhooks as they arrive, so customers, orders, checkouts, products and stock reach Brevo without waiting for a batch. Sync rules run in **batches**: contact sync rules every 15 minutes by default. An active rule's page has a **Test run (1 batch)** button.
#### Safety rails that stay on
- **Consent fails closed.** A rule that writes personal data to Brevo cannot be published without the consent and suppression filter, and a contact written to a marketing audience without provable consent is refused. When in doubt, Tajo refuses rather than over-sends.
- **Budgets are capped.** Spend limits are enforced; work stops rather than overrunning a budget.
- **Failures pause the rule.** If several consecutive runs fail, a circuit breaker pauses the rule automatically and shows the last error. Fix the underlying issue, then re-publish to resume.
- **Everything is audited.** Connections, approvals, publications, and runs all leave audit records.
### Verify It Worked
1. Check the sync rule's **Run history** — the latest run should show a healthy written count.
2. In Brevo, open **Contacts** and confirm your Shopify customers appear with mapped attributes.
3. If contacts are missing, see [contacts missing in Brevo](/resources/help/troubleshooting/contacts-missing-in-brevo/) and [data not syncing](/resources/help/troubleshooting/data-not-syncing/).
### Common Questions
**Can Tajo publish the integration without a human?** No. Publication always requires a human approval with a rationale, and the approval is tied to the exact configuration reviewed. Only narrowly scoped, explicitly flagged routine actions can ever be auto-approved, and only if your workspace also opts in.
**Is data synced back to Shopify?** No. Sync runs one direction: from your source into Brevo.
**Is there a free trial?** Tajo is in early access and there is no self-serve free tier. Contact the team to get set up.
**Does the review step slow things down?** It adds one deliberate human decision before data moves. After that first approval, the sync runs unattended on its schedule until you change the rule — which requires a fresh approval.
**Can I disconnect later?** Yes. See [disconnect or reconnect](/resources/help/integrations/disconnect-or-reconnect/). Data already written to Brevo stays in Brevo.
### Related Articles
- [Understanding Shopify data sync](/resources/help/getting-started/understanding-data-sync/)
- [Account setup and team roles](/resources/help/getting-started/account-setup-and-roles/)
- [Set up your Brevo API key](/resources/help/integrations/brevo-api-key-setup/)
- [Troubleshooting: data not syncing](/resources/help/troubleshooting/data-not-syncing/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**How do I connect Shopify to Brevo with Tajo?**
Setup has five stages: connect your Shopify store and Brevo account under Connectors, let Tajo draft the integration, review the draft and its preview evidence, approve it with a written rationale, then publish. Nothing moves until a person approves.
**How do I connect Tajo to my Shopify store?**
In Tajo, open Connectors, choose Shopify and authorize access. Shopify asks you to grant permission and returns you to Tajo. Tajo requests the scopes listed in Shopify permissions explained, including write access to customers for a few specific writes, and the store then appears on the Connectors page with its connection status.
**Is the Shopify to Brevo sync real-time?**
The Tajo Shopify app does: it processes each Shopify webhook as it arrives, so customers, orders, checkouts, products and stock reach Brevo without waiting for a batch. Sync rules run in batches: contact sync rules every 15 minutes by default, and an active rule's page has a Test run (1 batch) button.
**Can Tajo publish an integration without a human approving it?**
No. Publication always requires a human approval with a written rationale, bound to the exact rule version reviewed. If the rule is edited after approval, the approval is invalidated and you request a new one.
**What happens if a sync rule keeps failing?**
After several consecutive failed runs a circuit breaker pauses the rule automatically and shows the last error on its page. Fix the underlying issue, then re-publish to resume.
**Does Tajo have a free trial?**
Tajo is in early access and there is no self-serve free tier. Contact the team to get set up. You need Shopify admin access, a Brevo account, and a Tajo account.
---
## Create Your First Campaign with Tajo and Brevo
Source: https://tajo.io/resources/help/getting-started/create-your-first-campaign/
Send your first email campaign to synced Shopify customers using Tajo and Brevo, from list selection to scheduling.
**Once your Shopify store is connected, you can send a targeted email campaign to real customer data in about 15 minutes.**
> **Before you start**
> - ✅ Shopify connected to Brevo via Tajo ([setup guide](/resources/help/getting-started/connect-shopify-to-brevo/))
> - ✅ First data sync completed ([understanding data sync](/resources/help/getting-started/understanding-data-sync/))
> - ✅ A verified sender domain in Brevo
### Step 1: Pick Your Audience
Open Brevo and go to **Contacts**. Tajo keeps your Shopify customers, orders, and products in sync, so you can build a segment from real behavior instead of a static list:
- New customers in the last 30 days
- Customers with more than one order
- Customers who bought a specific product
Save the segment so it updates automatically as new orders sync.
### Step 2: Build the Email
Go to **Campaigns > Create a campaign**. Choose a template, then set:
1. A clear subject line (test two with A/B if you can)
2. A preheader that complements the subject
3. One primary call to action
Use Shopify data fields (first name, last order) for personalization. Tajo syncs these into Brevo contact attributes automatically.
### Step 3: Test
Send a test to yourself and a colleague. Check it on mobile, confirm links work, and verify personalization renders for a contact with and without the attribute filled.
### Step 4: Schedule or Send
Send immediately, or schedule for a mid-week morning as a safe default. For larger lists, enable Brevo's send-time optimization so each contact receives the email when they are most likely to engage.
### After Sending
Watch open, click, and (for stores) revenue for the first 24 to 48 hours. Use what you learn to refine the next campaign. To automate repeat sends, see [welcome series setup](/resources/help/automation-workflows/welcome-series-setup/).
### Troubleshooting
- **Segment looks empty?** Confirm the data sync finished ([data not syncing](/resources/help/troubleshooting/data-not-syncing/)).
- **Landing in spam?** Check sender authentication ([emails going to spam](/resources/help/troubleshooting/emails-going-to-spam/)).
### Frequently asked questions
**How do I send my first email campaign to Shopify customers with Brevo?**
In Brevo, open Contacts and build a segment from synced Shopify behavior, such as new customers in the last 30 days. Then go to Campaigns > Create a campaign, choose a template, set a subject, preheader and one call to action, send a test, then schedule or send.
**When is the best time to send an email campaign?**
A mid-week morning is a safe default. For larger lists, enable Brevo's send-time optimization so each contact receives the email when they are most likely to engage.
**What do I need before sending a campaign from Brevo with Tajo?**
Three things: Shopify connected to Brevo via Tajo, a completed first data sync, and a verified sender domain in Brevo.
**How do I personalize a Brevo campaign with Shopify data?**
Use Shopify data fields such as first name and last order in the email. Tajo syncs these into Brevo contact attributes, so they are available for personalization. Test with a contact that has the attribute filled and one that does not.
**What should I check after sending a campaign?**
Watch opens, clicks and, for stores, revenue over the first 24 to 48 hours, then use what you learn on the next campaign.
---
## Understanding Shopify Data Sync with Brevo
Source: https://tajo.io/resources/help/getting-started/understanding-data-sync/
How Tajo moves Shopify data into Brevo: the Shopify app's webhook sync as events arrive, and governed sync rules with scheduled runs, a consent filter, idempotent writes and an audit trail.
**Tajo moves Shopify data into Brevo in two ways. The Tajo Shopify app processes Shopify webhooks as they arrive. Sync rules are human-approved, one-directional, run in batches and logged end to end. This article explains both, what they do not include, and the few things the Tajo Shopify app writes back to Shopify.**
> **Quick check**
> This article assumes you have connected Shopify and Brevo and published at least one sync rule. If not, start with [connecting Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/).
### As Events Happen: the Tajo Shopify App
The Tajo Shopify app subscribes to Shopify webhooks and processes each one as it arrives. Customer and product changes wait about four seconds first. Customers, orders, checkouts, products, collections and stock levels reach Brevo this way, along with events such as `order_paid` and `cart_abandoned`. The [Shopify integration guide](/docs/ecommerce-platforms/shopify/) lists every topic and what it writes to Brevo.
### The Shape of a Sync Rule
A **sync rule** is a reviewed, approved definition of exactly what moves and how. An agent builds it from your description, and a person approves it. A rule has four parts you can inspect on its page under **Connections > Syncs and mappings**:
| Part | What it does |
|------|--------------|
| **Field mapping** | Each source field, the Brevo field it writes to, and any transform in between |
| **Filter expression** | Evaluated per record; records that do not match are skipped |
| **Cursor** | Tracks how far syncing has progressed, so each run picks up where the last one stopped |
| **Run history** | Every run, with records read, written, and failed, plus duration and status |
A sync rule moves data **one direction: from your source into Brevo**. It never writes to Shopify. The Tajo Shopify app does write a few things back to Shopify, such as consent opt-outs and loyalty tier tags. [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/) lists each write and when it happens.
### When a Sync Rule Runs
Sync rules run in **batches**. Contact sync rules run every 15 minutes by default. An active, published Shopify orders → Brevo orders rule runs every 15 minutes too, but only with the template's buyer marketing opt-in filter. A rule whose filter was edited runs only when you start it. An orders rule's first scheduled run starts a few minutes before that moment and sends no older orders. Each later run sends the orders updated since the previous one. Past orders reach Brevo only when you run the rule yourself. An active rule's page has a **Test run (1 batch)** button, and the Sync Operator agent runs active rules when you ask it to. Batch runs are what make every write reviewable, budgeted and attributable to a specific run.
Each run reads new and changed records since the cursor, applies the filter, maps the fields, and writes to Brevo. The run record shows exactly how many records were read, written, and failed.
### The Governance Guarantees
#### Consent fails closed
A rule that writes personal data to Brevo cannot be published without the consent and suppression filter. At run time, a contact written to a marketing audience without provable consent is refused. When consent cannot be established, Tajo refuses the write rather than guessing. The failure mode is always "too careful", never "over-sent".
#### Runs are idempotent
Every write carries a key derived from the source record. The key is a hash, so it holds no personal data. Re-running a sync over the same records, after a failure, a pause or by hand, does not create duplicate writes.
#### Everything is audited
Publishing a rule, invalidated approvals and automatic pauses are recorded under **Activity**. Each approval decision carries a written rationale. Each run is recorded in the rule's run history. The approval that authorized a publication is bound to a digest of the exact rule that was previewed. Editing the rule returns it to draft and invalidates the approval, so what runs is always what was authorized.
#### Failures pause the rule
If five consecutive runs fail, a circuit breaker pauses the rule automatically and shows the last error on the rule's page. Fix the cause, then re-publish to resume. A partially failed run reports its failed count so you can see exactly what did not land.
### How Unsubscribes Are Respected
- When a contact unsubscribes via a Brevo email footer link, that opt-out is recorded against the contact, and Brevo excludes them from further campaigns.
- In the batch customer sync, the Tajo Shopify app compares the time of the Shopify consent with the time of the Brevo unsubscribe and keeps the later one.
- A consent change that arrives from Shopify as a webhook is written to Brevo as Shopify reports it.
- If the contact was subscribed in Shopify, the Tajo Shopify app marks them **unsubscribed** in Shopify as well. A Brevo event only ever moves a customer from subscribed to unsubscribed. It never subscribes anyone, so a subscribe in Brevo does not change Shopify.
### What Data Is Available
The Tajo Shopify app sends contacts, orders, order and cart events, the product catalog and stock. What a sync rule sends depends on its field mapping. For Shopify customers, the template maps identity fields, total spent, order count, tags and the opt-in into Brevo contact attributes you can use in [segments](/resources/help/email-marketing/segmentation-basics/) and campaigns. The exact mapping for your workspace is not hidden in a description: open the sync rule and read the field mapping table. That table is the authoritative answer to "what syncs".
### What Tajo Does Not Do Today
Being precise about the boundaries matters more than a long feature list:
- **No two-way sync rules.** A sync rule only writes into Brevo. The Shopify app's own writes to Shopify (consent opt-outs, Brevo engagement and loyalty metafields, loyalty tier tags) are listed in [Shopify permissions explained](/resources/help/integrations/shopify-permissions-explained/).
- **No real-time sync rules.** Sync rules run in batches. Only the Tajo Shopify app's webhook sync works as events arrive.
- **No back-in-stock button.** The app keeps product stock current in Brevo and sends a `back_in_stock` event to shoppers who asked to be notified. The request has to come from your storefront: the app does not add a "Notify me" button to your theme.
If one of these boundaries blocks a use case for you, tell the team — early access priorities are shaped by exactly this feedback.
### Where to See Your Data
- **In Tajo**: open the sync rule under **Connections > Syncs and mappings** for run history, cursor position and per-run counts. **Activity** records publications and automatic pauses.
- **In Brevo**: open **Contacts** and inspect any contact's attributes to confirm mapped fields are populating. Build segments on those attributes for targeting.
### Troubleshooting
- Contacts not appearing in Brevo: check the rule's latest run for failures and its status (a paused rule is not running). See [contacts missing in Brevo](/resources/help/troubleshooting/contacts-missing-in-brevo/).
- Runs failing repeatedly: the circuit breaker will pause the rule and show the last error. See [data not syncing](/resources/help/troubleshooting/data-not-syncing/).
- Duplicate contacts: writes are idempotent per source record, but pre-existing duplicates in Brevo stay. See [duplicate contacts](/resources/help/troubleshooting/duplicate-contacts/).
### Common Questions
**Can I make the sync faster?** An active rule's page has a **Test run (1 batch)** button. For changes as they happen, the Tajo Shopify app's webhook sync already covers customers, orders, checkouts, products and stock.
**What happens if a run fails halfway?** The run reports its failed count, the cursor only advances over what was processed, and the next run safely re-covers the ground — idempotency keys prevent duplicates.
**Can I change what syncs?** Yes. Ask the agent to change the rule's field mapping or filter. The edit returns the rule to draft, and it must go back through preview and approval before it runs again.
**Why did my rule pause itself?** Consecutive run failures trip the circuit breaker. The rule's page shows the failure count and last error; fix the issue and re-publish.
### Related Articles
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Troubleshooting: data not syncing](/resources/help/troubleshooting/data-not-syncing/)
- [Troubleshooting: contacts missing in Brevo](/resources/help/troubleshooting/contacts-missing-in-brevo/)
### Get Help
[Contact the team](/contact).
### Frequently asked questions
**How does Tajo sync Shopify data to Brevo?**
In two ways. The Tajo Shopify app processes Shopify webhooks as they arrive and writes customers, orders, checkouts, products, collections and stock to Brevo. Sync rules, which a person approves, move records such as customers into Brevo contacts on a schedule. Each rule has a field mapping, a filter evaluated per record, a cursor and a run history.
**Does Tajo sync data in real time?**
The Tajo Shopify app does: it queues each Shopify webhook and processes it as it arrives, so an order or a customer change does not wait for a batch. Sync rules run in batches: contact sync rules every 15 minutes by default, and an active rule can be test-run from its page.
**Does Tajo write data back to Shopify?**
A sync rule does not: it only writes into Brevo. The Tajo Shopify app does write a few things back. When a subscribed customer unsubscribes in Brevo, it marks them unsubscribed in Shopify, never the reverse. It also writes Brevo engagement and loyalty data to customer metafields and a loyalty tier tag. Shopify permissions explained lists every write and when it happens.
**What Shopify data gets synced to Brevo?**
The Tajo Shopify app sends contacts, orders, order and cart events, the product catalog and stock. A sync rule sends what its field mapping says. The Shopify customers template maps identity fields, total spent, order count, tags and the opt-in. The authoritative answer is the Field mapping table on your rule under Connections > Syncs and mappings.
**What happens if a sync run fails halfway?**
The run reports its failed count and the cursor only advances over what was processed, so the next run re-covers the ground. Every write carries a provenance key derived from the source record, so re-running never creates duplicates.
**How does Tajo handle unsubscribes?**
An unsubscribe through a Brevo footer link is recorded against the contact and Brevo excludes them from campaigns. If that customer was subscribed in Shopify, the Tajo Shopify app marks them unsubscribed there too. In the batch customer sync, the app compares the time of the Shopify consent with the time of the Brevo unsubscribe and keeps the later one. A consent change that arrives from Shopify as a webhook is written to Brevo as Shopify reports it. A Brevo event never subscribes anyone in Shopify.
---
## Set Up Your Brevo API Key in Tajo
Source: https://tajo.io/resources/help/integrations/brevo-api-key-setup/
Generate a Brevo API key and connect it to Tajo so your Shopify data can sync securely.
**Tajo connects to Brevo using an API key. This takes about 10 minutes and only needs to be done once per store.**
> **You will need**
> - ✅ A Brevo account (Free or paid)
> - ✅ Admin access to your Tajo account
### Step 1: Generate the Key in Brevo
1. Log in to Brevo.
2. Open the account menu (top right) and go to **SMTP & API**.
3. Select the **API Keys** tab.
4. Click **Generate a new API key**, name it `Tajo`, and copy the key.
Copy the key immediately. Brevo only shows it once.
### Step 2: Add the Key to Tajo
1. In Tajo, go to **Settings > Connections > Brevo**.
2. Paste the API key and save.
3. Tajo validates the key and confirms the connection.
### Step 3: Confirm It Works
After saving, Tajo runs a test call. A green status means the key is valid and the sync can begin. If you see an error, see Troubleshooting below.
### Security Best Practices
- Use a dedicated key named `Tajo` so you can revoke it without affecting other integrations.
- Never share the key or paste it into client-side code.
- Rotate the key periodically: generate a new one, update it in Tajo, then delete the old one in Brevo.
### Troubleshooting
- **"Invalid API key"**: the key was copied with a trailing space or is from the wrong Brevo account. Regenerate and paste again.
- **"Unauthorized"**: the Brevo plan or user role lacks API access. Use an admin-level Brevo user.
- **Connection drops later**: the key was deleted or rotated in Brevo. Generate a new one and update it in Tajo.
Next: [connect Shopify to Brevo](/resources/help/getting-started/connect-shopify-to-brevo/).
### Frequently asked questions
**Where do I get a Brevo API key for Tajo?**
Log in to Brevo, open the account menu at the top right, go to SMTP & API, select the API Keys tab, click Generate a new API key, name it Tajo and copy it. Brevo shows the key only once.
**How do I add my Brevo API key to Tajo?**
Paste the key into the Brevo connection in Tajo and save. Tajo validates the key with a test call; a green status means the connection is valid and the sync can begin.
**Why does Tajo say my Brevo API key is invalid?**
The key was copied with a trailing space or belongs to the wrong Brevo account. Regenerate the key in Brevo and paste it again. An Unauthorized error instead means the Brevo plan or user role lacks API access.
**Why did my Brevo connection in Tajo stop working?**
The key was deleted or rotated in Brevo. Generate a new key in Brevo and update it in Tajo.
**How should I handle my Brevo API key securely?**
Use a dedicated key named Tajo so you can revoke it without touching other integrations, never share it or paste it into client-side code, and rotate it periodically: generate a new one, update Tajo, then delete the old one in Brevo.
**Do I need a paid Brevo account to connect it to Tajo?**
No. A Free or paid Brevo account works, plus admin access to your Tajo account. The setup takes about 10 minutes and is done once per store.
---
## Connect Multiple Shopify Stores to One Brevo Account
Source: https://tajo.io/resources/help/integrations/connect-multiple-stores/
Sync several Shopify stores through Tajo into one Brevo account while keeping customer data, lists, and reporting cleanly separated by store.
**Run multiple storefronts through a single Brevo account, with each store's data tagged and segmented so campaigns never cross the wrong audience.**
> **Quick check**
> You need Owner or Admin access in Tajo, the Tajo app installed on each Shopify store, and one Brevo account you want all stores to feed into. Brevo bills per email or message sent, not per contact, so combining stores does not increase your contact cost.
### How Multi-Store Works in Tajo
Each Shopify store becomes its own **connection** inside one Tajo workspace. All connections can push contacts into the same Brevo account, but Tajo tags every contact with a `store_id` (and a store name attribute) so you can always tell which storefront a customer came from.
This is the recommended setup when you sell under several brands or regional domains but want unified marketing operations.
### Step 1: Connect the First Store
If you have not done this yet, follow [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/). Finish and verify this store before adding more.
### Step 2: Add Each Additional Store
1. In **Tajo > Settings > Connections > Shopify**, click **Add store**.
2. You are redirected to install the Tajo app on that store. Log in to that store's Shopify Admin and approve the [permissions](/resources/help/integrations/shopify-permissions-explained/).
3. Back in Tajo, the new store appears in the connections list with its own sync status.
4. Repeat for every store.
### Step 3: Choose a List Strategy
Decide how each store maps to Brevo lists. Pick one approach and stay consistent.
| Strategy | How it works | Best for |
|----------|--------------|----------|
| **One list per store** | Each store syncs to its own Brevo list | Distinct brands with separate audiences |
| **Shared list, store attribute** | All stores sync to one list, separated by `store_id` segments | Same brand, multiple regions or domains |
| **Hybrid** | Shared list plus per-store lists for store-specific campaigns | Cross-sell between sibling brands |
Set this per connection under **Connections > Shopify > [store] > List mapping**.
### Step 4: Build Per-Store Segments
In Brevo, create a segment for each store using the synced attribute:
- Condition: `store_id` equals the value shown in Tajo for that connection.
Always send store-specific campaigns to a store segment, never to the raw shared list. This prevents customers of Store A from receiving Store B promotions.
> **Tip**
> Tajo also syncs a readable `store_name` attribute. Use it in email content with a personalization tag so one template can greet customers with the correct brand name.
### Step 5: Verify Separation
1. Place a test order in **Store B** using a fresh email address.
2. Wait 30 to 60 seconds.
3. In Brevo, confirm the new contact carries Store B's `store_id` and appears only in the intended list or segment.
4. Confirm the same contact does not appear in Store A's segment.
### Handling a Customer Who Buys From Two Stores
If the same email shops at two stores, Brevo keeps one contact record. Tajo records both stores in the contact's order history and updates the most recent `store_id`. Use segments based on order history rather than the single `store_id` field when you need true cross-store audiences. To avoid duplicate records entirely, see [fixing duplicate contacts](/resources/help/troubleshooting/duplicate-contacts/).
### Disconnecting One Store
You can remove a single store without affecting the others. See [disconnect or reconnect](/resources/help/integrations/disconnect-or-reconnect/).
### Related Articles
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
- [Disconnect or reconnect a store](/resources/help/integrations/disconnect-or-reconnect/)
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Account setup and team roles](/resources/help/getting-started/account-setup-and-roles/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Can I connect several Shopify stores to one Brevo account with Tajo?**
Yes. Each Shopify store becomes its own connection inside one Tajo workspace, and all of them can push contacts into the same Brevo account. Tajo tags every contact with a store_id and a store_name attribute so you always know which storefront a customer came from.
**How do I add another Shopify store in Tajo?**
Finish and verify the first store, then add each additional store from the Shopify connections in Tajo: click Add store, install the Tajo app on that store from its Shopify Admin and approve the permissions. The new store appears in the connections list with its own sync status.
**Should each store sync to its own Brevo list?**
Pick one of three strategies and stay consistent: one list per store for distinct brands, a shared list separated by store_id segments for one brand across regions, or a hybrid with a shared list plus per-store lists for cross-selling between sibling brands.
**How do I keep customers of one store from getting another store's campaigns?**
In Brevo, create a segment per store with the condition store_id equals the value Tajo shows for that connection, and always send store-specific campaigns to that segment, never to the raw shared list.
**What happens when the same customer buys from two of my stores?**
Brevo keeps one contact record. Tajo records both stores in the contact's order history and updates the most recent store_id. For true cross-store audiences, segment on order history rather than the single store_id field.
---
## Disconnect or Reconnect Shopify and Brevo in Tajo
Source: https://tajo.io/resources/help/integrations/disconnect-or-reconnect/
Safely pause, disconnect, or reconnect your Shopify store or Brevo account in Tajo without losing customer data or breaking active automations.
**Whether you are migrating themes, rotating API keys, or troubleshooting, you can disconnect and reconnect cleanly without losing data already synced to Brevo.**
> **Quick check**
> You need Owner or Admin access. Disconnecting stops real-time sync immediately, but contacts and history already in Brevo stay intact. Active Brevo automations keep running on the data already present.
### What Happens When You Disconnect
| You disconnect | Real-time sync | Existing Brevo data | Running automations |
|----------------|----------------|---------------------|---------------------|
| Shopify | Stops | Kept | Keep running on existing data; no new triggers |
| Brevo | Stops (nowhere to send data) | Kept in Brevo | Keep running inside Brevo |
Disconnecting never deletes contacts, orders, or segments. It only stops new data from flowing.
### When to Disconnect vs. Pause
- **Pause sync** if you only need a short break (for example, a maintenance window). Sync resumes from where it stopped.
- **Disconnect** if you are changing the Brevo account, removing the integration, or doing a deep reinstall.
To pause: **Tajo > Settings > Connections > [connection] > Pause sync**.
### Disconnect Brevo
1. Go to **Settings > Connections > Brevo**.
2. Click **Disconnect**.
3. Confirm. Tajo stops sending data to Brevo and removes the stored API key.
Your Brevo account, lists, and contacts are untouched. Only the link is removed.
### Disconnect Shopify
You can disconnect from either side:
**From Tajo**
1. Go to **Settings > Connections > Shopify**.
2. Select the store and click **Disconnect store**.
**From Shopify Admin**
1. Open **Shopify Admin > Settings > Apps and sales channels**.
2. Find **Tajo** and click **Uninstall**.
> **Tip**
> Uninstalling the app from Shopify also revokes its permissions. If you plan to reconnect later, prefer disconnecting from inside Tajo so reconnecting is faster.
### Reconnect Brevo
1. Go to **Settings > Connections > Brevo**.
2. Click **Connect Brevo** and enter a valid API key. See [Brevo API key setup](/resources/help/integrations/brevo-api-key-setup/).
3. Tajo verifies the key and resumes sync.
4. Trigger a manual sync so any data created while disconnected is pushed.
### Reconnect Shopify
1. In **Tajo > Settings > Connections > Shopify**, click **Reconnect** (or **Add store** if it was fully uninstalled).
2. Approve the [Shopify permissions](/resources/help/integrations/shopify-permissions-explained/) again. After an app update or reinstall, permissions and webhooks must be re-granted or order events will not arrive.
3. Run a manual sync to backfill anything missed during the gap.
### Verify After Reconnecting
1. Check **Tajo > Sync Status**. The last successful sync should update to "Just now".
2. Place a test order with a fresh email address.
3. Confirm the contact and order appear in Brevo within about a minute.
If data still does not flow, work through [Shopify data not syncing](/resources/help/troubleshooting/data-not-syncing/).
### Filling the Gap
Any orders or signups that happened while disconnected are not lost. A manual sync after reconnecting backfills records that the Shopify API can still return. Very old gaps may require an extended historical import; contact support with the date range if needed.
### Related Articles
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
- [Connect multiple stores](/resources/help/integrations/connect-multiple-stores/)
- [Brevo API key setup](/resources/help/integrations/brevo-api-key-setup/)
- [Fix: Shopify data not syncing](/resources/help/troubleshooting/data-not-syncing/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Do I lose my data if I disconnect Shopify or Brevo from Tajo?**
No. Disconnecting never deletes contacts, orders or segments. It only stops new data from flowing. Contacts and history already in Brevo stay intact, and active Brevo automations keep running on the data already present.
**How do I pause the Tajo sync temporarily, and when should I disconnect instead?**
Pause from Tajo > Settings > Connections > the connection > Pause sync, for a short break such as a maintenance window; sync resumes from where it stopped. Disconnect when you are changing the Brevo account, removing the integration or doing a deep reinstall.
**How do I disconnect Brevo from Tajo?**
Open the Brevo connection in Tajo's settings, click Disconnect and confirm. Tajo stops sending data to Brevo and removes the stored API key. Your Brevo account, lists and contacts are untouched; only the link is removed.
**How do I disconnect Shopify from Tajo?**
Either from Tajo, by selecting the store in the Shopify connection settings and clicking Disconnect store, or from Shopify Admin under Settings > Apps and sales channels by uninstalling Tajo. If you plan to reconnect later, disconnect from inside Tajo so reconnecting is faster.
**How do I reconnect Shopify to Tajo after an app update?**
Click Reconnect in Tajo's Shopify connection settings, or Add store if the app was fully uninstalled, approve the Shopify permissions again, then run a manual sync to backfill anything missed. After an update or reinstall, permissions and webhooks must be re-granted or order events will not arrive.
**Are orders placed while Tajo was disconnected lost, and how do I fill the gap after reconnecting?**
Nothing is lost. After reconnecting, run a manual sync to backfill the records the Shopify API can still return. Very old gaps may need an extended historical import; contact support with the date range.
---
## Shopify Permissions Tajo Requests, Explained
Source: https://tajo.io/resources/help/integrations/shopify-permissions-explained/
What each Shopify permission Tajo asks for is used for, why it is needed, and how to review or revoke access.
**Tajo reads your store to sync it into Brevo, and writes back to Shopify in a few specific cases. Here is every scope it requests and every write it makes.**
### Permissions Requested
These are the scopes in Tajo's Shopify app configuration. Shopify shows the same list when you install.
| Scope | What Tajo uses it for |
|-------|-----------------------|
| `read_customers` | Sync customers and their marketing consent to Brevo |
| `write_customers` | The customer writes listed below: consent opt-outs, metafields and loyalty tier tags |
| `read_orders` | Order metrics and order events for Brevo contacts, and loyalty points |
| `read_products` | Sync your product catalog to Brevo |
| `read_inventory` | Keep product stock current in Brevo |
| `read_discounts`, `write_discounts` | Create the discount codes listed below |
| `read_pixels`, `write_pixels`, `read_customer_events` | Install a sandboxed web pixel for storefront event tracking |
| `read_companies` | Sync B2B companies to Brevo |
| `read_store_credit_accounts` | Sync each customer's store credit balance to Brevo as a contact attribute |
Tajo has no write access to orders, products or your theme.
### What Tajo Writes to Shopify, and When
Each write below happens only in the situation described.
| Write | When it happens |
|-------|-----------------|
| A customer's email or SMS marketing consent changes from subscribed to unsubscribed | The customer unsubscribes or is blocklisted in Brevo. Tajo registers this Brevo webhook after your first contact sync. A Brevo event never subscribes anyone in Shopify. |
| Customer metafields in the `brevo` namespace: last email open and click, last clicked link, bounces, spam complaints, last SMS delivery, and the time and text (first 255 characters) of the last SMS reply | Brevo's email and SMS event webhooks are registered for your store |
| Customer metafields in the `brevo_loyalty` namespace (points, tier and tier ID, store credit, voucher count, last loyalty event time) and a `loyalty:` tag | You run a Brevo loyalty program through Tajo and a member's balance or tier changes |
| A single-use discount code | A shopper redeems a loyalty reward they already hold and Brevo did not issue its own code |
| A discount code for a campaign | An agent proposes it and a person on your team approves it. The percentage is capped by your agent settings. |
| A shopper's own SMS marketing consent | The shopper changes their SMS preference from your storefront |
| A web pixel | You choose to install the tracking pixel in the app, during onboarding or from the pixel settings |
In the Tajo web app, an agent can also propose adding tags or metafields to a Shopify customer. Each proposal waits for a person to approve it. A workflow set up by the Tajo team can make the same writes once it is turned on, without asking each time.
### Reviewing Access
In Shopify Admin, go to **Settings > Apps and sales channels > Tajo** to see the granted scopes at any time.
### Revoking Access
Uninstalling Tajo from Shopify revokes its access and stops the sync. Tajo deletes the store's data from its own database. Contacts already synced remain in your Brevo account.
### Privacy
Tajo passes data from Shopify to your own Brevo account. It does not sell data. A customer who has not opted in to a channel in Shopify is added to Brevo blocklisted for that channel, so they cannot receive marketing on it. See [contacts missing in Brevo](/resources/help/troubleshooting/contacts-missing-in-brevo/) for how consent affects which customers appear.
Next: [connect Shopify to Brevo](/resources/help/getting-started/connect-shopify-to-brevo/).
### Frequently asked questions
**What Shopify permissions does Tajo request?**
Twelve scopes: read_products, read_customers, write_customers, read_orders, read_inventory, read_discounts, write_discounts, read_pixels, write_pixels, read_customer_events, read_companies and read_store_credit_accounts. Tajo has no write access to orders, products or your theme.
**Does Tajo write anything to my Shopify store?**
Yes, in specific cases. It moves a subscribed customer to unsubscribed in Shopify when they unsubscribe in Brevo, never the other way. It writes Brevo engagement and loyalty data to customer metafields and a loyalty tier tag, creates discount codes for loyalty rewards and for agent offers you approve, and installs a web pixel only when you choose to install it in the app.
**Why does Tajo need to read my Shopify customers and orders?**
Customers are read to sync contacts and their marketing consent into Brevo. Orders feed order metrics and events for segments and post-purchase flows, and loyalty points. Products are read to sync your catalog to Brevo.
**Where can I see which Shopify scopes Tajo has?**
In Shopify Admin, go to Settings > Apps and sales channels > Tajo to see the granted scopes at any time.
**What happens to my Brevo contacts if I uninstall Tajo from Shopify?**
Uninstalling revokes Tajo's access and stops the sync. Tajo deletes the store's data from its own database. Contacts already synced remain in your Brevo account.
**Does Tajo sell or share my Shopify data?**
No. Tajo passes data from Shopify into your own Brevo account and does not sell data. A customer who has not opted in to a channel in Shopify is added to Brevo blocklisted for that channel, so they cannot receive marketing on it.
---
## Rewards Tiers and How They Are Calculated
Source: https://tajo.io/resources/help/loyalty/points-and-rewards-rules/
How Tajo derives spend-based rewards tiers from synced order history — what the tiers are, how spend is counted, and how refunds and cancellations affect them.
**Tajo does not have a configurable points engine. What it has is simpler and needs no tuning: rewards tiers derived directly from each customer's synced order history. This article explains exactly how that calculation works.**
> **Quick check**
> Tiers only exist for customers whose order history is synced. If you have not connected your store yet, start with [connect Shopify to Brevo](/resources/help/getting-started/connect-shopify-to-brevo/).
### The Tier Ladder
Tiers are assigned from lifetime spend:
| Tier | Lifetime spend threshold |
|------|--------------------------|
| Bronze | 0 |
| Silver | 500 |
| Gold | 1,500 |
| Platinum | 5,000 |
Thresholds are fixed. There is no settings screen for earn rates, bonus actions, point expiration, or reward costs — those belong to a points engine Tajo does not currently ship.
### How Spend Is Counted
The calculation is conservative on purpose:
- Each order is counted once, no matter how many times it syncs.
- Cancelled orders are excluded entirely.
- Refunds are subtracted from lifetime spend. A refund can move a customer down a tier.
Alongside the current tier, Tajo derives the next tier and the customer's progress toward it, so you can build "close to the next tier" campaigns.
### Using Tiers
Tiers are segmentation and campaign material, not a customer-facing points balance:
- Build segments by tier or spend band, and target campaigns at them.
- Nudge customers who are close to the next tier.
- Prioritize win-back spend by tier value.
For campaign recipes, see [set up rewards-based campaigns](/resources/help/loyalty/set-up-loyalty-program/).
### Common Questions
**Can I change the thresholds?**
Not today. The ladder is fixed so that tiers mean the same thing across every workspace.
**Can customers see their points or redeem rewards?**
No. There is no customer-facing balance, no redemption, and no discount-code generation. If you need a redeemable points program, Tajo is not that tool today — and we would rather tell you that here than in your margin report.
**Why did a customer's tier go down?**
A refund or cancellation reduced their counted lifetime spend below the threshold.
### Related Articles
- [Set up rewards-based campaigns](/resources/help/loyalty/set-up-loyalty-program/)
- [Understanding data sync](/resources/help/getting-started/understanding-data-sync/)
### Frequently asked questions
**What are Tajo's rewards tiers and how are they calculated?**
From lifetime spend in synced order history: Bronze at 0, Silver at 500, Gold at 1,500 and Platinum at 5,000. Each order is counted once, cancelled orders are excluded, and refunds are subtracted. Tajo also derives the next tier and the customer's progress toward it.
**Can I change the rewards tier thresholds in Tajo?**
Not today. The ladder is fixed so that tiers mean the same thing across every workspace, and there is no settings screen for earn rates, bonus actions, point expiration or reward costs.
**Can customers redeem points in Tajo?**
No. Tajo has no configurable points engine, no customer-facing balance, no redemption and no discount-code generation. If you need a redeemable points program, Tajo is not that tool today.
**Why did a customer's tier go down?**
A refund or cancellation reduced their counted lifetime spend below the tier threshold. The calculation is conservative on purpose.
**What can I do with rewards tiers?**
Treat them as segmentation and campaign material: build segments by tier or spend band, nudge customers who are close to the next tier, and prioritize win-back spend by tier value.
---
## Reward Loyal Customers with Spend-Based Rewards Profiles
Source: https://tajo.io/resources/help/loyalty/set-up-loyalty-program/
Use Tajo's rewards profiles — spend tiers derived from synced Shopify order history — to target loyal customers in segments and campaigns. A configurable points engine is not available today.
**Tajo does not ship a configurable points-and-redemption loyalty engine today. What it does have is something you can use immediately: rewards profiles derived from the Shopify order history you have already synced — a spend tier per customer, progress toward the next tier, and the spend and order counts behind them — ready to drive retention segments and campaigns.**
> **Quick check**
> You need a connected Shopify store with an approved, published sync so order history is flowing. Rewards profiles are computed from that synced data — no extra app, no separate setup, and nothing customer-facing is switched on without you.
### What a Rewards Profile Is
For each customer, Tajo derives a rewards profile from their synced order history:
- **Lifetime spend and order count** — computed from order data, counting each order once, excluding cancelled orders, and subtracting refunds.
- **A spend tier** — bronze, silver, gold, or platinum, assigned from lifetime spend.
- **Progress to the next tier** — how close the customer is to moving up, useful for "you're almost there" messaging.
- **An indicative points figure** — a number derived from spend and order count. It is a derived score, not a balance customers accumulate or redeem.
#### The tiers
| Tier | Lifetime spend (store currency) |
|------|--------------------------------|
| Bronze | 0+ |
| Silver | 500+ |
| Gold | 1,500+ |
| Platinum | 5,000+ |
Tiers are recomputed from order history, so they stay honest: a refund lowers lifetime spend, and a cancelled order never counts.
### What Is Not Available Today
Being clear about this saves you time:
- **No earning rules.** There is no screen where you configure points per purchase, bonus actions, or award triggers. If you have seen older material describing a "Loyalty > Earning rules" setup, that UI does not exist.
- **No redemption.** Customers cannot spend points, and Tajo does not generate discount codes for reward redemptions.
- **No customer-facing balance.** There is no storefront widget showing a points balance.
If a full points engine matters for your program, tell the team — Tajo is in early access and this feedback directly shapes what gets built. In the meantime, spend tiers cover the highest-value retention use cases below.
### Use Tiers in Segments
Because tiers are a direct function of lifetime spend, you can build tier segments from the spend and order attributes that sync to Brevo. For example:
- **Gold and above**: total spent at or above 1,500 — your VIP audience.
- **Approaching silver**: total spent between 400 and 499 — one nudge from the next tier.
- **High-frequency, low-spend**: many orders but low total — candidates for upsell rather than discounts.
See [segmentation basics](/resources/help/email-marketing/segmentation-basics/) for building and saving segments. If you track tier as its own contact property, keep its allowed values to the four tier names so segments stay clean.
### Use Tiers in Campaigns
Tier-driven campaigns that work well with what exists today:
- **VIP treatment**: early access to launches or free shipping for gold and platinum customers. Fulfil the perk with a standard Shopify discount code you create — Tajo does not generate redemption codes.
- **Tier-up nudges**: message customers close to the next tier ("You're $60 from Gold"). Progress toward the next tier is exactly what the rewards profile computes.
- **Win-back by value**: prioritize lapsed platinum and gold customers in your [win-back flow](/resources/help/automation-workflows/win-back-lapsed-customers/) — they have the most proven value to recover.
- **Post-purchase recognition**: acknowledge a customer's tier in your [post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/).
As with everything in Tajo, campaign sends and connector writes go through the same approval and consent rules as the rest of the product — a rewards campaign cannot email anyone whose consent is not established.
### Verify the Data Behind a Profile
Tier accuracy depends entirely on synced order history:
1. Confirm your Shopify sync rule is **active** and its recent runs are healthy (**Connectors > Syncs**).
2. Spot-check one known repeat customer: their spend and order count in Tajo should match Shopify after refunds and cancellations.
3. If numbers look off, check for failed items in the sync's run history before assuming tier thresholds are wrong.
### Common Questions
**Do refunds and cancellations affect tiers?** Yes. Cancelled orders are excluded and refunds are subtracted from lifetime spend, so a customer's tier can move down as well as up.
**Can I change the tier thresholds?** The bronze/silver/gold/platinum thresholds are fixed today. If you need custom tiers, build segments directly on the spend attribute with your own boundaries — tiers are just named spend bands.
**Can customers see their tier or points?** Not through Tajo today. You can reference tier standing in the emails you send, which you control fully.
**Is historical data included?** Yes — profiles are derived from whatever order history your sync has brought in, so long-standing customers get credit for their full synced history.
### Related Articles
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Win back lapsed customers](/resources/help/automation-workflows/win-back-lapsed-customers/)
- [Build a post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/)
- [Understanding Shopify data sync](/resources/help/getting-started/understanding-data-sync/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Does Tajo have a loyalty program with points and rewards?**
Not a configurable points-and-redemption engine. What Tajo has today is a rewards profile per customer derived from synced Shopify order history: lifetime spend and order count, a spend tier, and progress to the next tier, ready to drive retention segments and campaigns.
**What are the loyalty tier thresholds in Tajo?**
Four tiers by lifetime spend in store currency: Bronze from 0, Silver from 500, Gold from 1,500 and Platinum from 5,000. The thresholds are fixed; for custom tiers, build segments on the spend attribute with your own boundaries.
**Do refunds lower a customer's loyalty tier?**
Yes. Cancelled orders are excluded and refunds are subtracted from lifetime spend, so a tier can move down as well as up. Each order counts once, no matter how many times it syncs.
**Can customers see or redeem their Tajo loyalty points?**
No. There are no earning rules, no redemption, no customer-facing balance and no generated discount codes. You can reference a customer's tier in the emails you send, and fulfil VIP perks with a standard Shopify discount code you create.
**How do I use loyalty tiers in Brevo campaigns?**
Four recipes that work with what exists today: VIP treatment such as early access for gold and platinum, tier-up nudges for customers close to the next tier, win-back prioritized by tier value, and tier recognition in the post-purchase flow. Build the segments on the synced spend and order attributes.
**Why do a customer's spend and tier look wrong in Tajo?**
Tier accuracy depends entirely on synced order history. Confirm the Shopify sync rule is active with healthy recent runs under Connectors > Syncs, spot-check one repeat customer against Shopify after refunds and cancellations, and look for failed items in the run history before blaming the thresholds.
---
## Collect SMS & WhatsApp Consent at Shopify Checkout
Source: https://tajo.io/resources/help/sms-whatsapp/collect-sms-whatsapp-consent/
Set up compliant SMS and WhatsApp consent collection on your Shopify checkout to grow your mobile marketing list
**Grow your SMS and WhatsApp marketing lists with compliant consent collection at checkout - the highest-converting touchpoint in your customer journey.**
### Why Collect at Checkout?
Checkout is the **#1 place to collect SMS and WhatsApp consent** because:
- ✅ **High intent**: Customer is actively purchasing, ready to engage
- ✅ **Contact info already provided**: Email and phone number entered
- ✅ **Trust established**: They're giving you their money
- ✅ **Conversion rates**: 25-40% opt-in rate at checkout vs. 5-10% on popups
**Industry benchmarks**:
- Email popup form: 2-5% conversion
- SMS popup form: 1-3% conversion
- **SMS at checkout: 25-40% conversion** ⬅️ 10x better!
---
### Compliance First: Know the Rules
Before collecting consent, understand the legal requirements:
#### United States (TCPA)
**Requirement**: Express written consent
**What this means**:
- ✅ Customer must check a box (not pre-checked)
- ✅ Must clearly state they're opting into marketing messages
- ✅ Must disclose message frequency and data rates
- ✅ Must provide opt-out instructions
**Penalties**: Up to $1,500 per violation (per message!)
#### European Union (GDPR)
**Requirement**: Explicit, freely given consent
**What this means**:
- ✅ Separate checkbox for marketing (not bundled with terms)
- ✅ Clear explanation of what they're consenting to
- ✅ Easy opt-out at any time
- ✅ Record of when/where consent was given
**Penalties**: Up to €20 million or 4% of annual revenue
#### Canada (CASL)
**Requirement**: Express consent
**What this means**:
- ✅ Similar to TCPA (checkbox required)
- ✅ Must identify your business
- ✅ Must provide contact info for questions
- ✅ Must honor opt-outs within 10 days
**Penalties**: Up to $10 million CAD
#### International (WhatsApp)
**Requirement**: Opt-in consent in all regions
**What this means**:
- ✅ WhatsApp requires opt-in consent globally
- ✅ Cannot use pre-checked boxes
- ✅ Must be separate from SMS consent
- ✅ Must comply with local data protection laws
**Tajo's Approach**: We automatically configure compliant consent based on your store's primary country and customer locations.
---
### Prerequisites
Before setting up consent collection:
- ✅ Tajo connected to Shopify ([Setup guide](/resources/help/#getting-startedconnect-shopify-to-brevo))
- ✅ Brevo account with SMS/WhatsApp enabled
- ✅ **Shopify plan**: Basic or higher (checkout customization)
- ✅ Phone number collection enabled at checkout
- ✅ 15 minutes to complete setup
**Note**: Shopify Basic, Standard, and Advanced plans all support checkout customization. Shopify Starter does NOT.
---
### Step 1: Enable SMS Consent in Tajo
#### 1.1 Access Tajo SMS Settings
1. Log in to [app.tajo.io](https://app.tajo.io)
2. Navigate to **Settings > SMS & WhatsApp**
3. Click **Shopify Checkout Integration**
#### 1.2 Configure SMS Consent
1. Toggle on **"Collect SMS consent at checkout"**
2. Select your compliance region:
- 🇺🇸 **United States** (TCPA compliant)
- 🇪🇺 **European Union** (GDPR compliant)
- 🇨🇦 **Canada** (CASL compliant)
- 🌍 **International** (Global best practices)
3. Customize checkbox text (or use defaults):
**US Default** (TCPA compliant):
```
☑️ Send me exclusive offers and updates via SMS
By checking this box, you agree to receive recurring automated marketing text messages (e.g., cart reminders) at the phone number provided. Consent is not a condition to purchase. Msg & data rates may apply. Msg frequency varies. Reply HELP for help or STOP to cancel.
```
**EU Default** (GDPR compliant):
```
☑️ I consent to receive marketing SMS messages
You can withdraw consent at any time by replying STOP or clicking the unsubscribe link in our messages. View our Privacy Policy.
```
4. Click **Save SMS Settings**
#### 1.3 Choose Double Opt-In (Optional)
**What is double opt-in?**
After checkout, send an SMS asking customer to reply "YES" to confirm consent.
**Pros**:
- ✅ Higher quality list (only engaged subscribers)
- ✅ Extra compliance layer
- ✅ Protects from fake phone numbers
**Cons**:
- ❌ 20-30% don't complete second step
- ❌ More complex setup
- ❌ Slower list growth
**Recommendation**:
- **Use double opt-in** if: High value per subscriber, compliance-critical industry (finance, healthcare)
- **Skip double opt-in** if: E-commerce, need fast list growth, already collecting at checkout (high intent)
**To enable**:
1. In Tajo SMS Settings, toggle on **"Double opt-in required"**
2. Customize confirmation message:
```
Welcome to [STORE NAME]! Reply YES to confirm you want to receive exclusive offers via SMS. Msg & data rates may apply.
```
3. Click **Save**
---
### Step 2: Enable WhatsApp Consent (Tajo Exclusive!)
**Why WhatsApp?**
- 📱 2 billion+ active users globally
- 📈 98% open rate vs. 20% for SMS
- 💬 Two-way conversations (customers can reply)
- 🌍 Preferred in 100+ countries
**Tajo Advantage**: We're the only Shopify + Brevo integration offering WhatsApp consent collection. Klaviyo, Mailchimp, and Omnisend don't support WhatsApp.
#### 2.1 Set Up WhatsApp Business Account
**Already have WhatsApp Business?** Skip to 2.2
**Need to set up?**
1. Go to [business.whatsapp.com](https://business.whatsapp.com)
2. Create WhatsApp Business Account
3. Verify your business phone number
4. Connect to Brevo:
- In Brevo, go to **Settings > WhatsApp**
- Click **Connect WhatsApp Business**
- Follow authorization flow
#### 2.2 Enable WhatsApp Consent in Tajo
1. In Tajo, go to **Settings > SMS & WhatsApp**
2. Toggle on **"Collect WhatsApp consent at checkout"**
3. Enter your **WhatsApp Business Number** (from Brevo)
4. Customize checkbox text:
**Recommended template**:
```
☑️ Send me order updates and offers via WhatsApp
Get instant order updates, exclusive deals, and customer support via WhatsApp. You can opt-out anytime. By checking this box, you agree to receive messages at the phone number provided.
```
5. Select consent type:
- **Marketing only** - Promotional messages
- **Transactional only** - Order updates
- **Both** (recommended) - All message types
6. Click **Save WhatsApp Settings**
#### 2.3 Customize WhatsApp Welcome Message
When someone opts in via checkout, send automatic welcome via WhatsApp:
1. In Tajo, go to **Automations > WhatsApp Welcome**
2. Enable **"Send welcome message to new WhatsApp subscribers"**
3. Customize message:
```
Hi {{FIRSTNAME}}! 👋
Thanks for joining our WhatsApp community!
Here's what you can expect:
✅ Exclusive offers & early access
✅ Order tracking & delivery updates
✅ Instant customer support
Your first-order discount: *{{DISCOUNT_CODE}}*
Shop now: {{STORE_URL}}
Questions? Just reply to this message!
```
4. Optional: Add welcome image/video
5. Click **Save & Activate**
---
### Step 3: Test Your Consent Collection
#### 3.1 Create Test Order
1. Visit your Shopify store in **incognito/private browsing mode**
2. Add product to cart
3. Proceed to checkout
4. Enter test email (e.g., yourname+test@gmail.com)
5. **Enter your real phone number** (for testing)
6. Look for checkboxes:
- ☑️ SMS consent checkbox
- ☑️ WhatsApp consent checkbox (if enabled)
7. **Check both boxes**
8. Complete checkout (use Shopify's test payment info)
#### 3.2 Verify Consent Was Recorded
**In Brevo**:
1. Log in to Brevo
2. Go to **Contacts > All Contacts**
3. Search for your test email
4. Open contact profile
5. Check **Subscription status**:
- Email: Should be subscribed
- SMS: Should be subscribed ✅
- WhatsApp: Should be subscribed ✅ (if you enabled)
**In Tajo**:
1. Go to **Tajo Dashboard > Contacts**
2. Search for your test email
3. Verify **Consent sources**:
- SMS: Shopify Checkout (with timestamp)
- WhatsApp: Shopify Checkout (with timestamp)
**On phone**:
- If you enabled WhatsApp welcome: Should receive WhatsApp message within 1 minute
- If you enabled double opt-in SMS: Should receive confirmation text
#### 3.3 Troubleshooting Tests
**Checkboxes not appearing?**
- Clear browser cache, try incognito mode
- Verify Tajo is connected: Dashboard > Integrations > Shopify (should be ✅)
- Check Shopify plan: Must be Basic or higher (not Starter)
- Ensure phone number field is required at checkout
**Consent not showing in Brevo?**
- Wait 2-3 minutes (sometimes there's a delay)
- Check Tajo sync logs: Dashboard > Sync Logs
- Verify Brevo API key is valid: Settings > Integrations > Brevo
**WhatsApp message not received?**
- Verify WhatsApp Business number is correct in Tajo settings
- Check Brevo WhatsApp connection: Brevo > Settings > WhatsApp
- Make sure you used a real phone number (not Google Voice or VOIP)
---
### Step 4: Optimize for Higher Opt-In Rates
#### 4.1 Positioning & Design
**Checkbox placement matters**:
✅ **Good placement**:
- Below email field, above payment section
- Near "Contact Information" section
- Grouped with other optional fields
❌ **Poor placement**:
- Bottom of page (below "Place Order" button)
- Hidden in collapsed sections
- Mixed with legal terms
**Design tips**:
- Use clear, readable font size (14-16px)
- Add icon (📱 or 💬) for visual appeal
- Use benefit-focused language: "Get exclusive offers" not "Subscribe to marketing"
#### 4.2 Copy Optimization
**Bad copy** (compliance-focused only):
```
☑️ I agree to receive marketing SMS messages. Msg & data rates may apply.
```
**Conversion rate**: 15-20%
**Good copy** (benefit + compliance):
```
☑️ Text me exclusive deals & order updates! Msg & data rates may apply.
```
**Conversion rate**: 30-35%
**Great copy** (specific benefit + urgency):
```
☑️ Get 10% off your next order via text + instant shipping updates! 📱
By checking, you agree to receive promotional SMS. Msg & data rates may apply. Reply STOP to opt-out.
```
**Conversion rate**: 40-50%
**Formula**: [Immediate benefit] + [Ongoing value] + [Compliance]
#### 4.3 Incentive Testing
Offer immediate value for opting in:
| Incentive | Opt-In Rate | Best For |
|-----------|-------------|----------|
| **No incentive** | 25-30% | Established brands with loyal customers |
| **Early access to sales** | 30-35% | Fashion, limited editions |
| **10% off next order** | 40-50% | New stores, growing lists |
| **Free shipping** | 35-45% | High AOV ($100+), free shipping threshold |
| **Exclusive products** | 45-55% | Subscription boxes, membership programs |
**Test these offers** to find what resonates with your audience.
#### 4.4 A/B Testing Framework
Set up split testing:
**Week 1-2**: Test checkbox copy
- Variant A: "Get exclusive offers via SMS"
- Variant B: "Text me 10% off + shipping updates"
- Measure: Opt-in rate
**Week 3-4**: Test checkbox placement
- Variant A: Above payment section
- Variant B: Below shipping address
- Measure: Opt-in rate
**Week 5-6**: Test incentive amount
- Variant A: 10% off next order
- Variant B: $10 off next order
- Measure: Opt-in rate AND redemption rate
**Ongoing**: Test seasonal offers, rotating benefits
---
### Step 5: Maintain Compliance
#### 5.1 Honor Opt-Outs Immediately
**TCPA/CASL requirement**: Process opt-outs within 10 days
**Best practice**: Instant (automated)
**Tajo handles this automatically**:
- Customer replies "STOP" to SMS → Unsubscribed in Brevo + Shopify
- Customer clicks unsubscribe in email → Removed from SMS list too
- Customer opts out via WhatsApp → All lists updated
**You should**:
- Never manually re-subscribe someone who opted out
- Never purchase SMS lists (always illegal in US/Canada/EU)
- Keep records of opt-out requests for 3+ years
#### 5.2 Respect "Do Not Call" Lists
**US only**: National Do Not Call Registry
- Applies to **voice calls**, not SMS/WhatsApp
- However, best practice is to not SMS numbers on DNC registry
- Tajo does NOT automatically check DNC registry (you're responsible)
**If you want to check**:
- Visit [donotcall.gov](https://www.donotcall.gov) for US numbers
- For enterprise users, Tajo can integrate with DNC scrubbing services (contact support)
#### 5.3 Keep Consent Records
**GDPR requirement**: Prove consent was freely given
**What to record** (Tajo does this automatically):
- ✅ When consent was given (timestamp)
- ✅ Where consent was collected (Shopify Checkout)
- ✅ What they consented to (exact checkbox text)
- ✅ IP address (if available)
- ✅ Double opt-in confirmation (if used)
**How long to keep**: Minimum 3 years after unsubscribe
**Where to find in Tajo**:
- Dashboard > Contacts > [Contact Name] > Consent History
#### 5.4 Annual Consent Refresh (Optional)
Some brands re-confirm consent annually to maintain list quality:
**Method 1: Re-engagement Campaign**
Send SMS/WhatsApp:
```
Hi {{FIRSTNAME}}! Still want to hear from us? Reply YES to keep getting exclusive offers, or STOP to unsubscribe.
```
**Method 2: Email Re-permission**
Send email with links:
- "Yes, keep me subscribed to SMS"
- "Unsubscribe from SMS"
**Should you do this?**
- **Yes** if: Highly regulated industry, GDPR-focused, or >50% inactive subscribers
- **No** if: High engagement rates, clear value proposition, e-commerce
---
### Advanced Strategies
#### Strategy #1: Separate Transactional & Marketing Consent
**For higher opt-ins**, offer two checkboxes:
```
☑️ Send me order & shipping updates via SMS (transactional)
☑️ Also send me exclusive offers & deals (marketing)
```
**Why this works**:
- Transactional checkbox gets 60-80% opt-in (high value, low risk)
- Marketing checkbox gets 30-40% opt-in
- You can send transactional messages to everyone, upsell later
**To set up in Tajo**:
1. Settings > SMS & WhatsApp
2. Toggle on **"Separate transactional consent"**
3. Customize both checkbox texts
4. Create separate Brevo lists for each type
#### Strategy #2: Progressive Disclosure (Email → SMS → WhatsApp)
**For maximum opt-ins**, collect in stages:
**Stage 1** (Checkout): Collect email only
**Stage 2** (Thank you page): Popup asking for SMS consent with 10% off
**Stage 3** (First email): Ask for WhatsApp consent with exclusive access
**Conversion rates**:
- Email at checkout: 95%+ (required)
- SMS at thank you page: 40-50% (immediate incentive)
- WhatsApp via email: 25-30% (layered asks)
**Result**: Higher overall consent without overwhelming at checkout
#### Strategy #3: Dynamic Consent Based on Cart Value
**For high-value carts**, offer bigger incentives:
```javascript
if (cart_value > 100) {
checkbox_text = "Get 15% off your next order via text + VIP early access"
} else {
checkbox_text = "Get 10% off your next order via text"
}
```
**Set up in Tajo**:
1. Settings > Checkout Customization
2. Toggle on **"Dynamic consent incentives"**
3. Set cart value thresholds and offers:
- $0-$50: 10% off next order
- $50-$100: $10 off + free shipping
- $100+: 15% off + VIP access
---
### FAQ
#### Do I need consent to send order confirmation SMS?
**Transactional messages** (order confirmation, shipping updates) have different rules:
**US (TCPA)**: No consent required for transactional messages, BUT customer must have provided phone number in context of transaction
**EU (GDPR)**: Can send transactional messages without marketing consent, but should give opt-out option
**Best practice**: Collect transactional consent separately from marketing consent (see Strategy #1 above)
**Tajo's approach**: We recommend collecting both transactional and marketing consent at checkout for maximum clarity.
#### Can I pre-check the consent checkbox?
**US**: ❌ No - Violates TCPA (pre-checked boxes not valid consent)
**EU**: ❌ No - Violates GDPR (consent must be "freely given")
**Canada**: ❌ No - Violates CASL
**Penalty for pre-checked boxes**: Up to $1,500 per message sent (TCPA)
**Tajo enforces this**: Our checkboxes are never pre-checked.
#### What if customer unchecks the box?
They complete checkout without SMS/WhatsApp consent. You can:
- ✅ Send order confirmation email (always allowed)
- ❌ Send marketing SMS/WhatsApp (not allowed)
- ✅ Show popup on thank you page asking for consent (optional)
- ✅ Send email asking them to opt-in to SMS (allowed)
#### Can I send marketing emails to customers who only consented to SMS?
**Yes**, IF they provided email during checkout. However:
- Best practice: Get explicit email consent too
- EU/GDPR: May require separate email consent checkbox
- Tajo recommendation: Use one checkbox for "Email + SMS" or separate checkboxes
#### How often can I text subscribers?
**There's no legal limit**, but best practices:
| Frequency | Unsubscribe Rate | Best For |
|-----------|-----------------|----------|
| **1-2x/week** | 0.5-1% | Most e-commerce |
| **3-4x/week** | 1-2% | Daily deals, flash sales |
| **Daily** | 3-5% | Time-sensitive (event tickets) |
| **Multiple times/day** | 10%+ | Avoid unless urgent |
**Tajo recommendation**: Start with 2x/week (Tuesday, Saturday). Monitor unsubscribe rate. If < 1%, you can increase frequency.
#### Can I text customers who bought from my Shopify POS?
**If you collected phone at POS**: Yes, BUT only if you had a consent checkbox at point of sale
**If customer just gave phone for receipt**: No, cannot send marketing messages
**Solution**: In Tajo, we auto-filter POS customers without consent flag. To text POS customers, collect consent at POS via tablet/iPad with form.
---
### Conclusion
You've now set up compliant SMS and WhatsApp consent collection at Shopify checkout! 🎉
**What you've achieved**:
✅ TCPA/GDPR/CASL compliant consent collection
✅ High-converting checkout placement
✅ WhatsApp consent (Tajo exclusive feature)
✅ Automated consent recording and management
✅ Welcome message automation
**Expected results**: 25-40% of checkout customers will opt-in to SMS, and 20-35% to WhatsApp.
---
### Next Steps
1. ✅ **Test your setup** with 3-5 real purchases (friends/family)
2. ✅ **Monitor opt-in rates** weekly in Tajo dashboard
3. ✅ **Build your first SMS campaign** to new subscribers
4. ✅ **Set up abandoned cart SMS** recovery flow
5. ✅ **Create WhatsApp automation** for order updates
---
### Related Articles
- [Build an Abandoned Cart Recovery Flow](/resources/help/#automation-workflowsabandoned-cart-recovery)
- [SMS & WhatsApp Compliance Guide](/resources/help/#sms-whatsappsms-compliance-guide)
- [Set Up WhatsApp Order Notifications](/resources/help/#sms-whatsappwhatsapp-order-notifications)
- [Connect Tajo to Shopify](/resources/help/#getting-startedconnect-shopify-to-brevo)
---
**Questions about consent collection?** Contact help@tajo.io or chat with us in the Tajo dashboard!
*Last updated: January 22, 2025*
### Frequently asked questions
**Why collect SMS and WhatsApp consent at checkout?**
Checkout is the highest-converting place to ask: the customer is buying, has already entered email and phone, and trusts you with money. Opt-in runs 25 to 40 percent at checkout against 5 to 10 percent on popups.
**What does TCPA require for SMS marketing consent in the US?**
Express written consent: an unchecked box the customer ticks, wording that clearly states they are opting into marketing messages, disclosure of message frequency and data rates, and opt-out instructions. Penalties run up to 1,500 dollars per violation, per message.
**What does GDPR require for SMS consent?**
Explicit, freely given consent: a separate checkbox for marketing not bundled with the terms, a clear explanation of what they are consenting to, easy opt-out at any time, and a record of when and where consent was given. Penalties reach 20 million euros or 4 percent of annual revenue.
**Can I pre-check the SMS consent checkbox?**
No. A pre-checked box is not valid consent under TCPA in the US, GDPR in the EU or CASL in Canada, and WhatsApp requires opt-in consent everywhere, separate from SMS consent.
**Which Shopify plans support consent collection at checkout?**
Shopify Basic, Standard and Advanced all support checkout customization. Shopify Starter does not. Phone number collection must also be enabled at checkout.
**Do I need consent to send order confirmation SMS?**
Transactional messages have different rules. Under TCPA no marketing consent is needed if the customer gave their phone number in the context of the transaction; under GDPR transactional messages can go without marketing consent but should carry an opt-out. Best practice is to collect transactional and marketing consent separately.
---
## Set Up Your SMS Sender for Shopify Campaigns
Source: https://tajo.io/resources/help/sms-whatsapp/set-up-sms-sender/
Configure a compliant SMS sender ID or number in Brevo through Tajo so order alerts and promotions reach Shopify customers reliably.
**Before you can text customers about orders or offers, you need a registered, compliant sender. This guide walks through choosing the right sender type and getting it approved.**
> **Quick check**
> You need a connected Shopify store syncing to Brevo through Tajo, Editor access or higher, and SMS credits in Brevo. SMS is billed per message sent. You also need collected SMS consent; set this up first with [collect SMS and WhatsApp consent](/resources/help/sms-whatsapp/collect-sms-whatsapp-consent/).
### Step 1: Choose the Right Sender Type
The correct sender depends on the destination country and whether customers need to reply.
| Sender type | Looks like | Replies | Best for |
|-------------|------------|---------|----------|
| **Alphanumeric sender ID** | Your brand name | No | One-way alerts in Europe and many countries |
| **Long code / virtual number** | A standard phone number | Yes | Two-way conversations |
| **Short code** | A 5 to 6 digit number | Yes | High-volume US and UK promotional sending |
| **10DLC number** | A US local number | Yes | US transactional and marketing traffic |
Some countries (notably the US) do not support alphanumeric sender IDs for promotional traffic and require a registered 10DLC number or short code.
### Step 2: Register the Sender in Brevo
1. Open **Brevo > Transactional or Campaigns > SMS settings**.
2. Click **Add a sender**.
3. Select the sender type from Step 1.
4. For an alphanumeric ID, enter your brand name (max 11 characters, no spaces).
5. For a number, start the provisioning or registration flow.
6. Submit for approval.
### Step 3: Complete US 10DLC Registration (If Sending to the US)
US carriers require brand and campaign registration before delivery:
1. Register your **brand** with your legal business name, address, and tax ID.
2. Register a **campaign** describing your message use case (for example, "Shopify order notifications and promotions").
3. Provide opt-in details: where and how customers consent (your Tajo checkout consent checkbox).
4. Wait for carrier approval. This typically takes a few business days.
Unregistered US traffic is heavily filtered or blocked, so do not skip this.
### Step 4: Set Sender Defaults in Tajo
1. In **Tajo > Settings > Channels > SMS**, select your approved Brevo sender.
2. Set the default sender for **transactional** messages (order confirmations, shipping).
3. Set the default sender for **marketing** messages.
4. Save.
Tajo uses these defaults whenever an automation or campaign sends SMS triggered by Shopify events.
### Step 5: Stay Compliant
Every marketing SMS must include:
- Clear sender identity (your brand)
- An opt-out instruction, usually "Reply STOP to unsubscribe"
- Messaging only to contacts who explicitly opted in
Honor STOP replies immediately. Brevo processes opt-outs automatically, and Tajo respects the consent status synced from your Shopify checkout.
> **Tip**
> Keep SMS short and time-sensitive. Use SMS for order and shipping alerts and genuinely urgent offers. Push longer storytelling to [email](/resources/help/email-marketing/email-templates-and-branding/) where it costs less per send.
### Step 6: Send a Test
1. Add your own number as a test contact with consent set to yes.
2. Trigger a test from **Tajo > Channels > SMS > Send test**.
3. Confirm the message arrives, the sender shows correctly, and the STOP instruction is present.
### Troubleshooting
| Symptom | Likely cause | Fix |
|---------|--------------|-----|
| Sender ID rejected | Country does not allow alphanumeric IDs | Provision a number instead |
| US messages not delivered | 10DLC registration incomplete | Finish brand and campaign registration |
| No messages send | No SMS credits in Brevo | Top up SMS credits |
| Contact not receiving | No SMS consent synced | Confirm consent at checkout |
### Related Articles
- [Collect SMS and WhatsApp consent](/resources/help/sms-whatsapp/collect-sms-whatsapp-consent/)
- [WhatsApp template approval](/resources/help/sms-whatsapp/whatsapp-template-approval/)
- [Build a post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/)
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Which SMS sender type should I use?**
It depends on the destination country and whether customers need to reply. An alphanumeric sender ID shows your brand name but takes no replies and suits one-way alerts in Europe. A long code or virtual number allows two-way conversation. A short code suits high-volume US and UK promotions, and a 10DLC number covers US traffic.
**Which SMS sender should I use for the US, and can it be my brand name?**
No. The US does not support alphanumeric sender IDs for promotional traffic. You need a registered 10DLC number or a short code, and US carriers require brand and campaign registration before delivery; unregistered traffic is heavily filtered or blocked.
**How long can an alphanumeric SMS sender ID be, and how do I register it?**
At most 11 characters with no spaces. Register it in Brevo: open the SMS settings, click Add a sender, choose the sender type, enter your brand name for an alphanumeric ID or start the provisioning flow for a number, then submit for approval.
**What does US 10DLC registration involve?**
Register your brand with the legal business name, address and tax ID, register a campaign describing the use case, provide opt-in details such as your checkout consent checkbox, then wait a few business days for carrier approval.
**What must every marketing SMS include?**
A clear sender identity, an opt-out instruction such as Reply STOP to unsubscribe, and messaging only to contacts who explicitly opted in. Honor STOP replies immediately; Brevo processes opt-outs automatically.
**Why are my SMS messages not sending or arriving?**
Four usual causes: the country rejects alphanumeric sender IDs, so provision a number; US 10DLC registration is incomplete; there are no SMS credits in Brevo; or the contact has no SMS consent synced from checkout.
---
## Get Your WhatsApp Message Templates Approved
Source: https://tajo.io/resources/help/sms-whatsapp/whatsapp-template-approval/
Submit, format, and get WhatsApp Business templates approved through Brevo so Tajo can send order updates and campaigns to Shopify customers.
**WhatsApp requires every business-initiated message to use a pre-approved template. This guide shows you how to write templates that pass review on the first try.**
> **Quick check**
> You need a connected Shopify store syncing through Tajo, a WhatsApp Business account linked in Brevo, and Editor access or higher. WhatsApp is billed per conversation. You also need WhatsApp consent collected at checkout; see [collect SMS and WhatsApp consent](/resources/help/sms-whatsapp/collect-sms-whatsapp-consent/).
### Why Templates Need Approval
WhatsApp only allows businesses to start a conversation using a template that Meta has reviewed. This protects users from spam. Once a customer replies, you have a 24-hour window for free-form messages. Templates fall into categories that affect pricing and review strictness.
| Category | Use for | Example |
|----------|---------|---------|
| **Utility** | Transactional updates tied to an order | Order confirmed, shipped, delivered |
| **Marketing** | Promotions and re-engagement | Sale announcement, win-back offer |
| **Authentication** | One-time passcodes | Login or verification codes |
Utility templates are cheaper and approve faster than marketing templates.
### Step 1: Draft the Template in Brevo
1. Open **Brevo > Conversations or Campaigns > WhatsApp templates**.
2. Click **Create template**.
3. Choose a language and the correct category.
4. Write the body using numbered placeholders for dynamic values, for example:
`Hi {{1}}, your order {{2}} from {{3}} has shipped. Track it here: {{4}}`
### Step 2: Map Placeholders to Tajo Data
In **Tajo > Channels > WhatsApp**, map each placeholder to a synced Shopify field:
| Placeholder | Tajo field |
|-------------|-----------|
| `{{1}}` | Customer first name |
| `{{2}}` | Order number |
| `{{3}}` | Store name |
| `{{4}}` | Tracking URL |
This lets one approved template personalize every message from live Shopify order data.
### Step 3: Follow the Approval Rules
Templates are rejected for predictable reasons. Avoid these:
- No placeholder with no surrounding text (for example, a body that is only `{{1}}`).
- No floating or doubled placeholders, and they must be sequential starting at `{{1}}`.
- No promotional language in a **Utility** template. Miscategorized templates get rejected.
- No abusive, misleading, or prohibited content.
- Keep grammar clean and provide example values when prompted.
> **Tip**
> Submit the message as **Utility** whenever it is genuinely tied to a specific order. Order confirmations and shipping updates sent as Utility cost less and almost always approve quickly. Reserve **Marketing** for true promotions.
### Step 4: Submit and Wait
1. Add example values for each placeholder.
2. Submit for review.
3. Status moves from **Pending** to **Approved** or **Rejected**. Review usually completes within minutes to a few hours, occasionally up to 24 hours.
### Step 5: Handle a Rejection
1. Open the rejected template to read Meta's reason.
2. Common fixes: change the category, remove promotional wording from a Utility template, add context around a lone placeholder.
3. Edit and resubmit. There is no penalty for resubmitting a corrected template.
### Step 6: Use the Approved Template in Tajo
1. In **Tajo > Automation**, add a **Send WhatsApp** step.
2. Select the approved template.
3. Confirm the placeholder mapping.
4. Activate the automation. A good first use is the [post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/).
### Maintaining Quality Rating
WhatsApp tracks how recipients react to your messages. To keep a healthy quality rating:
- Only message contacts who opted in at checkout.
- Send Utility messages people expect, like shipping updates.
- Keep marketing frequency low and relevant.
A low quality rating can reduce your messaging limits, so respect consent and frequency.
### Related Articles
- [Collect SMS and WhatsApp consent](/resources/help/sms-whatsapp/collect-sms-whatsapp-consent/)
- [Set up your SMS sender](/resources/help/sms-whatsapp/set-up-sms-sender/)
- [Build a post-purchase flow](/resources/help/automation-workflows/post-purchase-flow/)
- [Win back lapsed customers](/resources/help/automation-workflows/win-back-lapsed-customers/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Why do WhatsApp messages need an approved template?**
WhatsApp only lets a business start a conversation with a template that Meta has reviewed, to protect users from spam. Once a customer replies you have a 24-hour window for free-form messages.
**What are the WhatsApp template categories?**
Utility for transactional updates tied to an order, such as confirmed, shipped or delivered; Marketing for promotions and re-engagement; and Authentication for one-time passcodes. Utility templates are cheaper and approve faster than marketing ones.
**How do I create a WhatsApp template in Brevo?**
Open the WhatsApp templates section in Brevo, click Create template, choose a language and the correct category, and write the body with sequential numbered placeholders such as Hi {{1}}, your order {{2}} has shipped. Add example values for each placeholder and submit for review.
**Why was my WhatsApp template rejected?**
Predictable reasons: a body that is only a placeholder, floating, doubled or non-sequential placeholders, promotional language in a Utility template, or prohibited content. Read Meta's reason, fix it, and resubmit. There is no penalty for resubmitting a corrected template.
**How long does WhatsApp template approval take?**
Usually minutes to a few hours, occasionally up to 24 hours. The status moves from Pending to Approved or Rejected.
**How do I keep a healthy WhatsApp quality rating?**
Only message contacts who opted in at checkout, send Utility messages people expect such as shipping updates, and keep marketing frequency low and relevant. A low quality rating can reduce your messaging limits.
---
## Fix: Contacts Missing in Brevo
Source: https://tajo.io/resources/help/troubleshooting/contacts-missing-in-brevo/
Why some Shopify customers do not appear in Brevo after syncing with Tajo, and how to resolve each cause.
**If the sync runs but specific customers are absent in Brevo, it is usually a data-quality or consent rule, not a broken connection.**
### Step 1: Confirm the Sync Itself Is Healthy
If no contacts are syncing at all, this is a connection problem instead. Start with [data not syncing](/resources/help/troubleshooting/data-not-syncing/). Continue here only when some contacts arrive and others do not.
### Step 2: Check the Common Reasons
| Reason | Explanation | Resolution |
|--------|-------------|------------|
| No email address | Brevo contacts require a valid email | Expected. Guest checkouts without email cannot sync |
| Marketing consent off | Customer did not accept marketing | Working as intended; respect consent |
| Invalid email format | Typo or role address rejected | Clean the source data in Shopify |
| Still in backfill | Large historical import in progress | Wait for the backfill to finish |
| Filtered by your segment | Contact exists but not in the list you are viewing | Search the full Contacts table, not the segment |
### Step 3: Search the Full Contact List
Before assuming a contact is missing, search the entire Brevo Contacts table by email. It is often present but excluded from the segment you were viewing.
### Step 4: Validate One Customer End to End
Pick one missing customer in Shopify. Confirm they have a valid email and accepted marketing. Trigger a manual sync in Tajo, then search Brevo again. This isolates whether it is a data rule or a sync gap.
### Consent and Compliance
Tajo respects Shopify marketing consent. Contacts who did not opt in are intentionally not synced as marketing contacts. This protects your sender reputation and keeps you compliant.
Next: [understanding data sync](/resources/help/getting-started/understanding-data-sync/).
### Frequently asked questions
**Why are some Shopify customers missing in Brevo?**
Five common reasons: no email address, marketing consent off, an invalid email format, a large historical backfill still in progress, or the contact exists but is filtered out of the segment you are viewing. If no contacts sync at all, it is a connection problem instead.
**Does Tajo sync Shopify customers who did not opt in to marketing?**
No. Tajo respects Shopify marketing consent, so contacts who did not opt in are intentionally not synced as marketing contacts. This protects your sender reputation and keeps you compliant.
**How do I check whether one missing customer is a data rule or a sync gap?**
Pick one missing customer in Shopify, confirm they have a valid email and accepted marketing, trigger a manual sync in Tajo, then search Brevo again.
**Can guest checkouts without an email sync to Brevo?**
No. Brevo contacts require a valid email, so guest checkouts without one cannot sync. That is expected behavior.
**I cannot find a contact in my Brevo segment. Is it missing?**
Often not. Search the entire Brevo Contacts table by email before assuming the contact is missing; it is frequently present but excluded from the segment you were viewing.
---
## Fix: Shopify Data Not Syncing to Brevo
Source: https://tajo.io/resources/help/troubleshooting/data-not-syncing/
Diagnose and resolve the most common reasons Shopify customers, orders, or products stop syncing to Brevo through Tajo.
**If new customers or orders are not appearing in Brevo, work through these checks in order. Most cases resolve at step 1 or 2.**
> **Quick check**
> Open **Tajo > Sync Status**. A timestamp older than your last order is the clearest signal that the sync stalled.
### Step 1: Confirm Both Connections Are Healthy
- **Brevo**: Settings > Connections > Brevo should show a green status. If not, re-add the [API key](/resources/help/integrations/brevo-api-key-setup/).
- **Shopify**: the Tajo app should still be installed with permissions intact. A reinstall or permission change in Shopify can silently break the feed.
### Step 2: Check the Sync Status Page
Tajo logs each sync. Look for:
- **Last successful sync** time. If it is stale, trigger a manual sync.
- **Failed records** with an error reason (for example, a contact missing a valid email).
### Step 3: Common Causes
| Symptom | Likely cause | Fix |
|---------|--------------|-----|
| No new contacts at all | Brevo API key revoked or rate limited | Regenerate key, retry sync |
| Some contacts missing | Records without a valid email | Expected; Brevo requires an email |
| Orders missing | Webhook reconnect needed after app update | Reconnect Shopify in Tajo |
| Everything delayed | Large historical backfill in progress | Wait for backfill to complete |
### Step 4: Force a Manual Sync
In **Tajo > Sync Status**, click **Run sync now**. Watch the log. A clean run with zero failed records confirms the pipeline is healthy again.
### Still Stuck?
Note the exact error text from the sync log and your store size, then contact support. See also [contacts missing in Brevo](/resources/help/troubleshooting/contacts-missing-in-brevo/).
### Frequently asked questions
**Why are my new Shopify customers or orders not appearing in Brevo?**
Work through four checks in order: both connections healthy, with Brevo showing a green status and the Tajo app still installed in Shopify with permissions intact; the sync status and last successful sync time; the common causes table; then a manual sync. Most cases resolve at step 1 or 2.
**How do I check whether my Tajo sync has stalled?**
Open the sync status in Tajo. A last successful sync timestamp older than your most recent order is the clearest signal that the sync stalled. If it is stale, trigger a manual sync.
**Why are orders missing in Brevo while contacts sync fine?**
A webhook reconnect is usually needed after a Shopify app update. Reconnect Shopify in Tajo, then run a manual sync.
**How do I force a manual sync in Tajo?**
From the sync status page, run the sync now and watch the log. A clean run with zero failed records confirms the pipeline is healthy again.
**Why are no new contacts syncing to Brevo at all?**
The Brevo API key was probably revoked or rate limited. Regenerate the key in Brevo, update it in Tajo and retry the sync. Records without a valid email are a different case: Brevo requires an email, so those are skipped as expected.
---
## Fix: Duplicate Contacts in Brevo
Source: https://tajo.io/resources/help/troubleshooting/duplicate-contacts/
Find out why the same Shopify customer appears more than once in Brevo and how to merge, prevent, and clean up duplicate contacts through Tajo.
**If the same customer shows up several times in Brevo, work through these checks. Most duplicates come from mismatched email addresses or phone-only records.**
> **Quick check**
> Brevo uses **email as the unique identifier**. Two records with different email spellings, or a record with only a phone number, are treated as separate contacts even if they are the same person.
### Step 1: Identify Why Duplicates Happen
| Cause | Example | Result |
|-------|---------|--------|
| Different email spellings | `jane@gmail.com` vs `jane+shop@gmail.com` | Two contacts |
| Guest checkout then account | Same person, two Shopify customer records | Two contacts |
| Phone-only record | SMS opt-in with no email captured | Separate contact |
| Manual import overlap | A CSV imported alongside Tajo sync | Duplicated entries |
| Case or whitespace | `Jane@Gmail.com ` vs `jane@gmail.com` | Usually merged, sometimes not |
### Step 2: Confirm Tajo's Matching Behavior
Tajo deduplicates on email before sending to Brevo. It cannot merge two records that genuinely have different email addresses, because it cannot safely assume they are the same person.
Check **Tajo > Settings > Sync > Duplicate handling** and enable **Strict duplicate prevention**. This normalizes case and trims whitespace before matching, removing the most common near-duplicate.
### Step 3: Merge Existing Duplicates in Brevo
1. In **Brevo > Contacts**, open the **Duplicate contacts** tool.
2. Review the suggested pairs.
3. Choose the master record. Prefer the one with the richest order history and valid consent.
4. Merge. Brevo combines attributes and history into the master.
> **Tip**
> Merge in Brevo, not Shopify. Merging Shopify customer records can rewrite order associations. Let Tajo keep syncing and resolve duplicates on the Brevo side where email is the key.
### Step 4: Handle Phone-Only Duplicates
A contact captured by SMS opt-in with no email cannot be matched to an email-based contact automatically.
- Encourage email capture at SMS opt-in so future records can be linked.
- For existing phone-only records, manually merge in Brevo if you can confirm the same person.
### Step 5: Prevent Future Duplicates
- Keep **Strict duplicate prevention** enabled in Tajo.
- Avoid manual CSV imports into the same list Tajo manages. If you must import, dedupe the file against Brevo first.
- In Shopify, encourage account creation so repeat buyers reuse one customer record instead of repeated guest checkouts.
- For [multiple stores](/resources/help/integrations/connect-multiple-stores/), remember one email is one Brevo contact across all stores by design; segment by `store_id` rather than expecting separate records.
### Step 6: Verify the Cleanup
1. After merging, place a test order with an existing customer's exact email.
2. Confirm in **Tajo > Sync Status** the record updates the existing contact rather than creating a new one.
3. Spot-check the merged contact in Brevo for intact order history and correct consent.
### When to Contact Support
Reach out with specifics if:
- Duplicates keep appearing for the **same exact email** after enabling strict prevention.
- A merge in Brevo is repeatedly re-split by sync.
- You see thousands of duplicates suggesting a misconfigured import.
Include the affected email addresses and a screenshot of the Tajo duplicate handling settings.
### Related Articles
- [Fix: Shopify data not syncing](/resources/help/troubleshooting/data-not-syncing/)
- [Connect multiple stores](/resources/help/integrations/connect-multiple-stores/)
- [Segmentation basics](/resources/help/email-marketing/segmentation-basics/)
- [Connect Tajo to Shopify](/resources/help/getting-started/connect-shopify-to-brevo/)
### Get Help
- Live Chat: available in the Tajo dashboard (bottom right)
- Email Support: help@tajo.io
- Documentation: [docs.tajo.io](https://docs.tajo.io)
### Frequently asked questions
**Why does the same customer appear twice in Brevo?**
Brevo uses email as the unique identifier. Different email spellings, a guest checkout followed by an account, a phone-only SMS opt-in, a CSV import alongside the Tajo sync, or case and whitespace differences each produce a separate contact.
**How does Tajo prevent duplicate contacts?**
Tajo deduplicates on email before writing to Brevo. It cannot merge two records with genuinely different email addresses, because it cannot safely assume they are the same person. Enable strict duplicate prevention in Tajo's sync settings to normalize case and trim whitespace before matching.
**Should I merge duplicate contacts in Shopify or in Brevo?**
In Brevo, with its Duplicate contacts tool: review the suggested pairs, choose the master record with the richest order history and valid consent, and merge. Merging Shopify customer records can rewrite order associations, so leave Shopify alone.
**How do I handle phone-only duplicate contacts?**
A contact captured by SMS opt-in without an email cannot be matched to an email contact automatically. Capture email at SMS opt-in so future records link, and merge existing phone-only records in Brevo by hand once you confirm it is the same person.
**How do I stop duplicates coming back?**
Keep strict duplicate prevention enabled, avoid manual CSV imports into the list Tajo manages, encourage account creation in Shopify so repeat buyers reuse one record, and with several stores segment by store_id rather than expecting separate records.
**How do I stop Tajo creating near-duplicate contacts in Brevo?**
Enable strict duplicate prevention in Tajo's sync settings. It normalizes letter case and trims whitespace before matching on email, which removes the most common near-duplicate. Records with genuinely different email addresses still stay separate.
---
## Fix: Emails Going to Spam
Source: https://tajo.io/resources/help/troubleshooting/emails-going-to-spam/
Why campaigns sent through Brevo land in spam and the exact authentication and list steps to fix inbox placement in 2026.
**Spam placement is almost always a sender reputation or authentication problem, not a content one. Fix these in order.**
> **2026 reality**
> Gmail and Yahoo require bulk senders to authenticate with SPF, DKIM, and DMARC, keep spam complaints under 0.3%, and include one-click unsubscribe. Missing any one of these is enough to be filtered.
### Step 1: Authenticate Your Domain
This is the single biggest fix. In Brevo, add and verify:
- **SPF**: authorizes Brevo to send for your domain.
- **DKIM**: cryptographically signs your mail.
- **DMARC**: tells inbox providers what to do with unauthenticated mail, and must align with your From domain.
Send from your own domain (`you@yourbrand.com`), never from a free address like gmail.com.
### Step 2: Add One-Click Unsubscribe
Ensure your campaigns include a working list-unsubscribe header and a visible unsubscribe link. Brevo adds this automatically; do not remove it.
### Step 3: Clean the List
Engagement is now a primary filter signal.
- Remove hard bounces and never re-add them.
- Apply a sunset policy: stop emailing contacts who have not opened in 6 to 12 months.
- Only email people who opted in. Purchased lists destroy reputation.
Because Tajo syncs real Shopify behavior, segment to engaged buyers instead of blasting the whole list.
### Step 4: Warm Up and Stay Consistent
A new domain or sudden volume spike looks like spam. Increase volume gradually and keep a steady cadence rather than rare large blasts.
### Step 5: Re-Test
Send to a seed set across Gmail, Outlook, and Apple Mail. If still filtered, check your domain and IP against major blocklists and review subject lines for obvious spam triggers.
See also [improve email deliverability](/resources/help/email-marketing/improve-deliverability/).
### Frequently asked questions
**Why are my Brevo emails landing in spam?**
Almost always sender reputation or authentication, not content. Fix in order: authenticate your domain in Brevo with SPF, DKIM and DMARC, keep the one-click unsubscribe Brevo adds, clean the list, warm up volume gradually, then re-test across Gmail, Outlook and Apple Mail.
**What do Gmail and Yahoo require from bulk email senders?**
SPF, DKIM and DMARC authentication, spam complaints under 0.3%, and one-click unsubscribe. Missing any one of these is enough to be filtered.
**How do I authenticate my sending domain in Brevo?**
In Brevo, add and verify SPF, which authorizes Brevo to send for your domain, DKIM, which signs your mail, and DMARC, which must align with your From domain. Send from your own domain, never from a free address like gmail.com.
**How do I clean my email list to improve deliverability?**
Remove hard bounces and never re-add them, stop emailing contacts who have not opened in 6 to 12 months, and only email people who opted in. Purchased lists destroy reputation. Because Tajo syncs real Shopify behavior, segment to engaged buyers instead of blasting the whole list.
**Can I remove the unsubscribe link from my Brevo campaigns?**
No. Campaigns need a working list-unsubscribe header and a visible unsubscribe link. Brevo adds this automatically; do not remove it.
---
# Articles
## An evaluation rubric is a theory of good work
Source: https://tajo.io/blog/a-rubric-is-a-theory-of-good-work/
Published: 2026-10-08 · Updated: 2026-10-08
Before an AI judge scores an agent, ask the person who knows the task which outcomes count and which errors disqualify the result.
Summary: An AI evaluation rubric decides what the team means by good before a model assigns scores. Start with a few real cases, ask the task expert to mark acceptable and disqualifying outcomes, and turn exact facts into code checks. Compare any model judge with human ratings and inspect disagreements. A score can help find regressions; it cannot repair a rubric that rewards the wrong work.
A reply about a returned order looks ready to send: grammatical, friendly and short. In this illustrative case, an automated score gives it full marks. The assistant also tells the customer a refund has been issued, although nobody checked the payment system.
The error is not a weak sentence. It is a weak definition of *good*.
In an [ingested evaluation demonstration](https://www.youtube.com/watch?v=wPdoZRbvaF4), a team builds scores for an agent that writes software documentation. The interesting moment is when the person who knows the work describes what quality means, and a tool turns that description into criteria. Later, a low score provokes the right doubt: perhaps the agent needs a fix, or perhaps the evaluation does.
The rubric is a theory about the task. Test the theory.
### Start with the disqualifying mistake
Teams often begin with dimensions that are easy to score: clarity, tone, structure, completeness. They are useful. They are rarely sufficient.
For the illustrative refund reply, “never claim a completed refund without a payment receipt” belongs above prose quality. For a data sync, “do not map a billing email to the account owner's email” matters more than whether the field-map explanation reads well.
Ask the domain expert for three kinds of cases: one obviously good, one obviously wrong and one case where informed people might disagree. Preserve the source records and the reason for each judgment. If a case depends on a rule that may change, version the rule with the label.
The first pass can be small. It cannot be vague.
| Check | Better owner | Why |
| --- | --- | --- |
| Required permission exists | Code and authoritative records | The fact is exact and consequential |
| Destination ID matches source identity | Code and a test record | A model should not guess an identifier |
| Reply answers the customer's question | Human-reviewed rubric, possibly a model judge | Meaning needs interpretation |
| Tone suits the situation | Human-reviewed rubric, possibly a model judge | More than one acceptable form exists |
Our [Jev use cases article](/blog/jev-use-cases/) makes the same boundary for typed decisions: code copies original values and checks constraints after a model selects among candidates. The model's confidence does not become permission.
### A score inherits the rubric's blind spots
The objection is fair: “A human cannot review every agent run. We need a scalable judge.” Yes. The question is what the judge is scaling.
If the rubric rewards a polished answer and never checks whether the order was actually refunded, automation will scale the omission. A number with two decimal places looks precise. It can still be measuring the wrong thing.
[Google Cloud's judge-evaluation documentation](https://docs.cloud.google.com/vertex-ai/generative-ai/docs/models/evaluate-judge-model) describes a practical check: prepare cases with human ratings, run the model-based metric, and compare its scores with those ratings. The point is not that one person's view is infallible. It is that the model needs an external standard before its score can carry weight.
Inspect disagreements, not only average agreement. If the judge passes a reply that a support lead rejected, ask which missing criterion explains it. If two experts disagree, keep both labels and find the rule they interpret differently. Do not silently average away the dispute.
Sampling matters as much as the wording of a criterion. A collection of routine successes can make a judge look reliable while leaving the hard cases untouched. Include incomplete records, conflicting instructions and cases where the correct answer is to stop and ask. Keep a separate set of cases the rubric authors did not tune on, so a change that improves familiar examples has to prove itself elsewhere too. When the business rule changes, refresh both labels and expected outcomes; a frozen test set can reward yesterday's policy.
### Keep the outcome attached to the evaluation
A rubric for a sync agent should follow the customer's result. Did the correct contact change? Was consent respected? Can a failed record be replayed without repeating a consequential action?
The [Brevo connector guide](/blog/brevo-connector-guide/) explains why a successful API call can coexist with a missing attribute. An evaluation that checks only whether the agent called the endpoint will miss the outcome. One that checks only the destination may miss a prohibited path that happened to end with the right value. Both matter when the path carries risk.
Start with one narrow task and a few failure modes. Label the cases with the person who owns the task. Put exact checks in code, and use a model judge only where language or judgment truly requires it. Run the same cases after a prompt, model or tool change. Record what later failures reveal about the rubric.
The cost is expert time up front. The win is that every later score has a meaning someone can defend.
A dashboard can show a score. Only the rubric tells you what you counted.
### Frequently asked questions
**Who should define an AI agent's evaluation criteria?**
The people who know the task and its consequences should define acceptable results and disqualifying errors. Engineers can turn those judgments into repeatable checks and evaluate whether a model judge agrees with human ratings.
**Is a high judge score proof that an agent works?**
No. A score measures agreement with a rubric on the cases tested. A weak rubric, unrepresentative cases or a poorly calibrated judge can give a high score to a harmful result.
**What should be checked by code instead of a model judge?**
Exact permissions, record identifiers, required tool calls and destination state should be checked with code whenever possible. A model judge is useful for semantic qualities that exact rules cannot settle.
---
## A useful map leaves things out
Source: https://tajo.io/blog/a-useful-map-leaves-things-out/
Published: 2026-10-08 · Updated: 2026-10-08
A diagram helps when it preserves the relationships needed for a task. Name what it distorts and offer a companion view when another task needs those details.
Summary: A useful map is selective. Decide the reader’s task, preserve the relationships that task depends on, and state which details the representation distorts or omits. A schematic route map can clarify connections while obscuring geographic distance; a system diagram can clarify data flow while hiding permissions or failure timing. Provide the companion view when that omission changes a decision.
A rail diagram can make a transfer obvious by straightening lines and spacing stations evenly. It can also make two stops look far apart when they are a short walk. The same abstraction that helps a rider choose a train can mislead a rider choosing a walking route.
A [history of a transit diagram](https://www.youtube.com/watch?v=B1Yu_0_2Ofc) asks what happened when a schematic view served tasks beyond route selection. The [New York Transit Museum’s account](https://www.nytransitmuseum.org/vignelli/) confirms that the 1972 map straightened routes and removed most topographic detail. The story is a useful reminder that an image can be good for one task and still need a companion view for another. The exact production history of proposed companion aids is not needed for that lesson.
### Define the route the reader is trying to find
Every diagram removes information. A system architecture sketch leaves out time. A workflow chart leaves out data values. A map of sync directions may leave out who can authorize a write. Removal is often the reason the picture is readable. The problem begins when the removed property matters to the reader’s choice.
Imagine an illustrative store-to-email sync diagram with two boxes and one arrow: Store → Email platform. It helps answer “which system sends the customer record?” It cannot answer whether consent travels with the record, how duplicates are handled or whether a purchase cancels a queued message. The picture is not wrong. It is incomplete for those decisions.
Before drawing, write the reader’s question in one sentence.
“Where does this field originate?” needs lineage. “What happens if the source is unavailable?” needs timing and failure states. “Who may trigger a campaign?” needs permissions. One page can carry several views, but a single view should not pretend to optimize every task.
| View | Relationship it preserves | Common distortion |
| --- | --- | --- |
| Schematic route map | Connections and transfers | Physical distance and direction |
| Data-flow diagram | Sources, consumers and direction | Timing and authority |
| Sequence diagram | Order of calls and responses | Long-lived state and human work |
| Permission matrix | Allowed principals and actions | The user journey through the system |
These are conceptual examples, not evaluations of specific products or maps.
### Show the omission at the point of use
A footnote saying “not to scale” can help a traveler understand a schematic map. For a sync diagram, a caption might say “shows normal data direction; see the failure path and permission table for writes.” That is more useful than a generic disclaimer because it names the missing decision.
The companion view should be chosen by consequence. If the diagram is used in a security review, permissions are not optional context. If it is used to troubleshoot stale records, timestamps and retry states matter more than box placement. If it is used to plan a new integration, field ownership and correction paths may determine the implementation.
This is why visual neatness can be a trap. An arrow that crosses no other arrows looks clean, but it may hide a feedback path. Uniform boxes suggest equivalent responsibilities even when one system owns truth and another holds a disposable projection. Design should make the operational asymmetry visible when it matters.
### Offer the next view where it is needed
One diagram can serve several readers if it offers the next view at the point where a decision needs it. Begin with the view that answers the immediate question and offer a nearby link or switch to the next needed view. Keep labels consistent across them so the reader knows that “customer” in the flow is the same object in the permission table.
A useful review asks someone unfamiliar with the system to make two decisions. First, use the diagram for its intended purpose. Second, ask a question that depends on an omitted property. If the reader confidently makes a wrong inference, the omission needs a label or a companion view. If they know where to look next, the abstraction is doing its job.
The [data-ownership guide](/blog/how-to-integrate-multiple-business-tools/) covers the underlying integration choices. A map of those choices should help a reader take the right next step, not merely admire a complete-looking architecture.
A diagram can carry its own test case. Place one normal record and one exception on the page and ask the reader to trace both. If the exception disappears at an unlabeled arrow, the diagram has hidden a decision. A version for executives may omit field names but still needs to show the owner of a failure. A version for implementers may show schemas and retries but omit organizational politics. The question is whether each omission preserves the task. When a new reader must guess, add the missing relationship or point to the companion view, rather than filling every spare inch with boxes.
A map succeeds by leaving things out with care. It fails when the missing thing is the thing the reader came to decide.
### Frequently asked questions
**What makes a simplified diagram honest?**
It identifies the task it serves and the properties it preserves, then makes important omissions visible. It should not imply that layout, distance or completeness is literal when it is not.
**When does a diagram need a companion view?**
When readers must make a decision based on something it deliberately removes, such as physical distance, access control, latency or an exception path.
**How should a team review a system map?**
Ask a reader to perform the intended task with it, then test a second task that depends on omitted details. Revise the map or link a companion view where the omission would mislead.
---
## A/B Testing: The Complete Guide to Split Testing for Marketing (2026)
Source: https://tajo.io/blog/ab-testing-guide/
Published: 2026-03-22 · Updated: 2026-05-22
Learn how to run A/B tests that actually improve conversions. Covers email, landing pages, and ads with real examples, tools, and statistical best practices.
Summary: A/B testing replaces opinion with evidence, but only when the test is powered and the metric is a real one. Change one variable, size the sample before launch, and run to significance instead of stopping on the first promising day. The same discipline applies to email, landing pages, and ads.
A/B testing is one of the highest-leverage activities in marketing. Instead of debating whether a red button converts better than a green one, you let your audience decide with real data. Companies that test systematically outperform those that rely on instinct, and the gap widens over time.
This guide covers everything you need to run A/B tests that produce reliable, actionable results across email campaigns, landing pages, ads, and product experiences. Whether you are new to split testing or looking to sharpen your methodology, you will find practical frameworks, real examples, and tool recommendations here.
### What is A/B Testing?
**A/B testing** (also called split testing) is a controlled experiment where you compare two versions of a marketing asset to determine which one performs better against a specific metric. You randomly divide your audience into two groups, show each group a different version, and measure the difference in outcomes.
The concept is borrowed from randomized controlled trials in science. By changing only one variable at a time and keeping everything else constant, you can isolate the effect of that single change with statistical confidence.
#### How A/B Testing Works
Every A/B test follows the same core loop:
1. **Observe** a performance metric you want to improve (e.g., email open rate is 18%)
2. **Hypothesize** a change that could improve it ("A shorter, curiosity-driven subject line will increase opens")
3. **Create** two versions: the control (A) and the variation (B)
4. **Split** your audience randomly so each group is statistically equivalent
5. **Run** the test for a predetermined duration or until you reach the required sample size
6. **Analyze** results using statistical significance to confirm the winner
7. **Implement** the winning version and document the learning
Sequence, triggered by: A metric you want to improve
1. Hypothesize
2. Create
3. Split
4. Run
5. Analyze
6. Implement
#### A/B Testing vs. Multivariate Testing
A/B testing compares two versions with one changed element. Multivariate testing (MVT) changes multiple elements simultaneously and measures every combination.
| Feature | A/B Testing | Multivariate Testing |
|---------|------------|---------------------|
| Variables changed | One | Multiple |
| Versions needed | 2 | Many (2^n combinations) |
| Sample size required | Moderate | Very large |
| Complexity | Low | High |
| Best for | Focused optimization | Understanding interactions |
| Time to results | Faster | Slower |
For most marketing teams, A/B testing is the better starting point. Multivariate testing becomes useful when you have very high traffic and want to understand how elements interact with each other.
### Why A/B Testing Matters
#### Data Replaces Opinion
Marketing teams waste enormous amounts of time arguing about subjective preferences. A/B testing replaces "I think this headline is better" with "version B increased signups by 14% with 95% confidence." That shift changes how teams make decisions and allocate resources.
#### Small Gains Compound
A 5% improvement in conversion rate might seem modest on its own. But when you stack multiple 5% improvements across your funnel, the impact is dramatic:
- **Email open rate**: 18% improved to 18.9% (+5%)
- **Click-through rate**: 3.2% improved to 3.36% (+5%)
- **Landing page conversion**: 8% improved to 8.4% (+5%)
- **Combined effect**: 12.6% more conversions from the same traffic
Over a year of consistent testing, these incremental gains can double or triple your marketing performance without increasing spend.
#### Reducing Risk
Launching a complete website redesign or a new email template without testing is a gamble. A/B testing lets you validate changes with a small audience segment before rolling them out broadly. If the new version underperforms, you have limited the blast radius to a fraction of your users.
#### Building Institutional Knowledge
Every test, whether it wins or loses, adds to your organization's understanding of what drives customer behavior. Over time, this creates a compounding knowledge advantage that competitors cannot easily replicate.
### What to A/B Test
The highest-impact tests target elements that directly influence key conversion metrics. Here is a breakdown by channel.
#### Email A/B Testing
Email is one of the easiest and most rewarding channels to test because you have full control over the variables and can measure results quickly.
**Subject lines** are the single highest-impact element to test in email marketing. They determine whether your message gets opened at all.
Test variations like:
- **Length**: Short (3-5 words) vs. descriptive (8-12 words)
- **Personalization**: Including the recipient's name or company vs. generic
- **Urgency**: "Last chance" or deadline language vs. neutral phrasing
- **Curiosity**: Open loops ("The one metric most marketers ignore") vs. direct benefit statements
- **Emoji**: With vs. without
- **Number specificity**: "5 strategies" vs. "strategies" without a number
**Email content** tests to consider:
- **CTA placement**: Above the fold vs. after building the case
- **CTA copy**: "Get started" vs. "Start your free trial" vs. "See how it works"
- **Layout**: Single-column vs. multi-column
- **Image usage**: Product images vs. lifestyle images vs. text-only
- **Content length**: Brief and punchy vs. detailed and comprehensive
- **Social proof**: Including testimonials vs. statistics vs. neither
**Send time optimization** can significantly impact open rates. Test sending the same email at different times of day or different days of the week to identify when your specific audience is most responsive.
#### Landing Page A/B Testing
Landing pages offer the most variables to test and often produce the largest conversion lifts.
**Headlines**: Your headline is the first thing visitors read and has the largest influence on bounce rate.
- Benefit-driven ("Grow your email list 3x faster") vs. feature-driven ("AI-powered email list builder")
- Question format ("Still losing subscribers?") vs. statement format
- Short and bold vs. long and specific
**Call-to-action buttons**:
- Button color (test contrast, not just colors in isolation)
- Button text ("Sign up free" vs. "Start growing" vs. "Get my account")
- Button size and placement
- Single CTA vs. multiple CTAs
**Page layout and design**:
- Long-form vs. short-form pages
- Video above the fold vs. static image
- Testimonial placement and format
- Form length (fewer fields vs. more qualification)
- Trust badges and security seals
**Pricing presentation**:
- Monthly vs. annual pricing displayed first
- Including a "most popular" tag
- Three-tier vs. two-tier pricing
#### Ad A/B Testing
Paid advertising platforms like Google Ads and Meta Ads have built-in A/B testing capabilities, but disciplined methodology still matters.
- **Ad copy**: Different value propositions, emotional vs. rational appeals
- **Headlines**: Various angles targeting the same keyword intent
- **Creative**: Different images, videos, or graphic styles
- **Audience segments**: Testing the same ad across different targeting criteria
- **Landing page destinations**: Sending ad traffic to different pages
#### CTA and Conversion Element Testing
Beyond individual channels, test the conversion elements that appear across your marketing:
- **Form length**: Every additional field reduces completions, but increases lead quality
- **Social proof format**: Star ratings vs. written testimonials vs. customer logos
- **Urgency elements**: Countdown timers, limited availability notices
- **Guarantee messaging**: Money-back guarantees, free trial terms
- **Navigation**: Including vs. removing navigation on conversion pages
### How to Run an A/B Test: Step-by-Step
#### Step 1: Define Your Goal and Metric
Start with one clear metric. Trying to optimize for multiple metrics simultaneously leads to ambiguous results.
Good examples:
- "Increase email open rate from 22% to 25%"
- "Improve landing page conversion rate from 3.5% to 4.5%"
- "Reduce cart abandonment rate from 68% to 62%"
#### Step 2: Form a Hypothesis
A strong hypothesis has three components:
> "If we [change], then [metric] will [improve/decrease] because [reasoning]."
Example: "If we shorten our signup form from 6 fields to 3 fields, then form completion rate will increase by at least 15% because reducing friction lowers the perceived effort required."
The reasoning matters because it turns tests into learning opportunities even when the hypothesis is wrong.
#### Step 3: Calculate Your Required Sample Size
Running a test without knowing your required sample size is one of the most common mistakes. You need enough data for the result to be statistically meaningful.
The required sample size depends on three factors:
1. **Baseline conversion rate**: Your current performance
2. **Minimum detectable effect (MDE)**: The smallest improvement worth detecting
3. **Statistical power**: The probability of detecting a real effect (typically 80%)
4. **Significance level**: Your tolerance for false positives (typically 5%, or p < 0.05)
**Example calculation:**
Suppose your landing page converts at 5% (baseline) and you want to detect a 20% relative improvement (to 6%). With 80% power and 95% significance:
- Required sample size per variation: approximately **3,600 visitors**
- Total sample needed: **7,200 visitors**
The formula uses the following approximation:
```
n = (Z_alpha/2 + Z_beta)^2 * [p1(1-p1) + p2(1-p2)] / (p2 - p1)^2
```
Where:
- Z_alpha/2 = 1.96 (for 95% confidence)
- Z_beta = 0.84 (for 80% power)
- p1 = 0.05 (baseline rate)
- p2 = 0.06 (expected rate with improvement)
Plugging in:
```
n = (1.96 + 0.84)^2 * [0.05(0.95) + 0.06(0.94)] / (0.06 - 0.05)^2
n = (2.80)^2 * [0.0475 + 0.0564] / (0.01)^2
n = 7.84 * 0.1039 / 0.0001
n ≈ 8,146 per variation
```
In practice, most marketers use an online sample size calculator or the one built into their testing tool. The key takeaway: smaller effects require much larger sample sizes to detect reliably.
#### Step 4: Create Your Variations
Keep it disciplined:
- **Change only one element** per test. If you change the headline and the button color simultaneously, you cannot attribute the result to either change.
- **Make the change meaningful**. Testing "Buy now" vs. "Buy Now" (capitalization) is unlikely to produce detectable results. Test genuinely different approaches.
- **Document exactly what changed** so results are reproducible.
#### Step 5: Randomize and Split Your Audience
Proper randomization is critical. Each visitor or recipient should have an equal probability of seeing either version. Most testing tools handle this automatically, but verify that:
- The split is truly random (not based on geography, device, or time of arrival)
- Each user sees the same version consistently (no flickering between versions)
- Your sample groups are large enough to be statistically representative
#### Step 6: Run the Test to Completion
This is where discipline matters most. **Do not peek at results and stop the test early when one version looks like a winner.** Early results are noisy and unreliable.
Common rules:
- Run the test until you reach your pre-calculated sample size
- Run for at least one full business cycle (typically 1-2 weeks for web, one full send for email)
- Do not change anything mid-test
#### Step 7: Analyze Results and Determine Statistical Significance
A result is **statistically significant** when there is less than a 5% probability that the observed difference occurred by random chance (p-value < 0.05).
**Example**: Your test shows version B converted at 6.2% vs. version A at 5.0%, with a p-value of 0.03. This means there is only a 3% chance that this 1.2 percentage point difference is due to random variation. You can confidently implement version B.
However, if the p-value is 0.15, the observed difference is not reliable enough to act on, even if version B "won." You would need more data or a larger effect size.
#### Step 8: Implement and Iterate
Apply the winning version. Document the hypothesis, what was tested, the result, and the confidence level. Then move on to the next test.
The best testing programs maintain a backlog of test ideas ranked by potential impact and ease of implementation.
### Statistical Significance: Going Deeper
#### Understanding Confidence Intervals
Rather than relying solely on p-values, look at confidence intervals. A 95% confidence interval tells you the range within which the true conversion rate likely falls.
If version B shows a conversion rate of 6.2% with a 95% CI of [5.4%, 7.0%], and version A shows 5.0% with a 95% CI of [4.3%, 5.7%], the overlapping ranges suggest the difference may not be as clear-cut as the point estimates imply.
#### Common Statistical Mistakes
- **Peeking**: Checking results multiple times inflates your false positive rate. If you check a test 5 times during its run, your effective significance level may be 15-25% instead of 5%.
- **Stopping early**: Ending a test the moment one version reaches significance often captures noise, not signal.
- **Ignoring sample size requirements**: Running a test with 200 visitors and declaring a winner is unreliable regardless of what the numbers show.
- **Testing too many variations**: Running an A/B/C/D/E test splits your sample five ways, dramatically reducing statistical power.
- **Survivorship bias in reporting**: Only sharing winning tests creates a misleading picture of testing effectiveness.
#### Bayesian vs. Frequentist Approaches
Traditional A/B testing uses frequentist statistics (p-values and confidence intervals). Some modern tools use Bayesian methods, which express results as probabilities ("there is a 94% probability that B is better than A").
Bayesian methods offer some practical advantages:
- Results are easier to interpret for non-statisticians
- You can monitor results continuously without inflating error rates
- They handle small sample sizes more gracefully
Both approaches are valid. The important thing is to use one consistently and understand its assumptions.
### A/B Testing Tools Comparison
Choosing the right tool depends on what you are testing and the scale of your operation.
#### Brevo
**Best for**: Email A/B testing and multi-channel campaign optimization
Brevo offers robust built-in A/B testing for email campaigns that makes split testing accessible even for smaller marketing teams. Key capabilities include:
- **Subject line testing**: Test up to four subject line variations and automatically send the winner to the remaining list
- **Content testing**: Compare entirely different email layouts and copy
- **Send time optimization**: AI-powered send time prediction based on individual recipient behavior patterns
- **Winner criteria flexibility**: Choose your winning metric (opens, clicks, or revenue) and set the test duration
- **Automated winner deployment**: Set it and forget it. Brevo sends the winning version to the rest of your list after the test period ends
Brevo's advantage is that A/B testing is natively integrated into the same platform you use for email, SMS, WhatsApp, and marketing automation. There is no additional cost or third-party integration required, and results feed directly into your campaign analytics.
**Pricing**: A/B testing is available on the Business plan and above.
#### Optimizely
**Best for**: Enterprise web and product experimentation
Optimizely is the industry standard for website and product A/B testing at scale. It supports feature flags, server-side testing, and sophisticated audience targeting. The platform offers full-stack experimentation, meaning you can run tests across web, mobile, and backend systems.
**Pricing**: Custom enterprise pricing, typically starting at several thousand dollars per month.
#### VWO (Visual Website Optimizer)
**Best for**: Mid-market website and conversion optimization
VWO provides a visual editor for creating test variations without code, along with heatmaps, session recordings, and surveys. It strikes a good balance between ease of use and analytical depth.
**Pricing**: Plans start around $199/month for basic testing.
#### Google Analytics / Google Tag Manager
**Best for**: Basic website testing on a budget
While Google Optimize was sunset in 2023, you can still run basic A/B tests using Google Analytics 4 in combination with Google Tag Manager. The setup requires more technical effort than dedicated tools, but it is free and integrates naturally with your existing analytics.
**Pricing**: Free.
#### Unbounce
**Best for**: Landing page A/B testing
Unbounce combines a landing page builder with built-in A/B testing, making it straightforward to create and test landing page variations. Its Smart Traffic feature uses AI to automatically route visitors to the variant most likely to convert for their profile.
**Pricing**: Plans start at $74/month, with A/B testing available on higher tiers.
#### Tools Comparison Summary
| Tool | Best Channel | A/B Testing Ease | AI Features | Starting Price |
|------|-------------|-------------------|-------------|---------------|
| Brevo | Email, SMS, Multi-channel | Very easy | Send time AI, auto-winner | Included in Business plan |
| Optimizely | Web, Product | Moderate | Predictive analytics | Enterprise pricing |
| VWO | Web, Landing pages | Easy (visual editor) | AI-powered insights | ~$199/month |
| GA4 + GTM | Web | Technical | Basic ML insights | Free |
| Unbounce | Landing pages | Easy | Smart Traffic routing | $74/month |
Decision: What are you testing?
- If Email and multi-channel campaigns: Brevo (Built into campaign creation on the Business plan.)
- If Web and product at enterprise scale: Optimizely (Feature flags and server-side testing.)
- If Mid-market website conversion: VWO (Visual editor, heatmaps and session recordings.)
- If Basic website tests, no budget: GA4 + Google Tag Manager (Free, with more technical setup.)
- If Landing pages: Unbounce (Builder and testing in one tool.)
### Real A/B Testing Examples
#### Example 1: Email Subject Line Test
**Company**: An e-commerce store selling outdoor gear
**Test**: Two subject line approaches for a seasonal sale email
- **Version A**: "Spring Sale: 30% Off All Hiking Gear"
- **Version B**: "Your next adventure starts here (30% off inside)"
**Results**:
- Version A: 24.3% open rate, 4.1% click rate
- Version B: 28.7% open rate, 3.8% click rate
- Winner: Version B for opens, Version A for clicks
**Learning**: Curiosity-driven subject lines increased opens but attracted less purchase-intent traffic. The team decided to optimize for click rate since it correlated more strongly with revenue.
#### Example 2: Landing Page CTA Button
**Company**: A SaaS product offering a free trial
**Test**: CTA button text on the pricing page
- **Version A**: "Start Free Trial"
- **Version B**: "Start Free Trial - No Credit Card Required"
**Results**:
- Version A: 3.8% conversion rate
- Version B: 5.1% conversion rate (34% improvement, p = 0.008)
**Learning**: Removing perceived risk in the CTA copy significantly increased signups. The objection "do I need to enter my credit card?" was a major friction point even though the page already mentioned this in smaller text.
#### Example 4: Ad Creative Test
**Company**: A B2B software company running LinkedIn ads
**Test**: Two creative approaches for the same audience
- **Version A**: Product screenshot with feature callouts
- **Version B**: Customer testimonial quote with headshot
**Results**:
- Version A: 0.38% CTR, $42 cost per lead
- Version B: 0.61% CTR, $28 cost per lead (33% lower CPL)
**Learning**: Social proof outperformed product features for cold audiences on LinkedIn. The team subsequently tested different testimonial formats and found that specific metrics in the quote ("saved 12 hours per week") outperformed general praise.
### Common A/B Testing Mistakes
#### 1. Testing Without a Hypothesis
Running random tests without a clear hypothesis generates data but not knowledge. Always start with a reasoned prediction about why a change might work. Even when your hypothesis is wrong, the reasoning helps you learn and design better tests.
#### 2. Ending Tests Too Early
The temptation to declare a winner after a few hundred data points is strong, especially when early results look dramatic. Resist it. Early results regress toward the mean as more data accumulates. Commit to your sample size calculation before the test starts.
#### 3. Testing Trivial Changes
Changing a button from #FF0000 to #FF1100 will not produce measurable results. Focus on changes that address real user concerns, objections, or behavior patterns. The best tests change the message, the offer, or the user flow, not minor cosmetic details.
#### 4. Ignoring Segment Differences
An overall "no difference" result can mask significant differences within segments. Version B might work dramatically better for mobile users while performing worse for desktop users. Always analyze results by key segments (device, source, new vs. returning) when sample sizes allow.
#### 5. Not Accounting for External Factors
A test that runs during a holiday sale period will produce different results than one running during a normal week. Be aware of seasonal effects, promotional calendars, news events, and other external factors that could skew results.
#### 6. Testing Too Many Things at Once
If you change the headline, hero image, CTA text, and page layout all at once, a positive result tells you something worked but not what. Prioritize your test ideas by potential impact and test the highest-leverage elements first.
#### 7. Not Building a Testing Culture
A/B testing fails when it is treated as a one-off project rather than an ongoing practice. The most successful companies run tests continuously, maintain a shared repository of results, and make testing a standard part of every campaign launch.
### Building an A/B Testing Program
#### Creating a Test Backlog
Maintain a prioritized list of test ideas using the ICE framework:
- **Impact**: How much could this test improve the target metric? (1-10)
- **Confidence**: How confident are you that this test will produce a meaningful result? (1-10)
- **Ease**: How easy is it to implement this test? (1-10)
Multiply the three scores to rank tests. A high-impact, high-confidence, easy-to-implement test (like a subject line test in Brevo) should be prioritized over a potentially high-impact but complex test (like a full checkout redesign).
#### Establishing a Testing Cadence
Aim for a consistent rhythm:
- **Email tests**: Run with every major campaign send. Brevo makes this especially easy since the A/B functionality is built into the campaign creation flow.
- **Landing page tests**: Run continuously, with 2-4 tests per month depending on traffic volume.
- **Ad tests**: Run 1-2 creative tests per ad set per month.
#### Documenting and Sharing Results
Create a simple test log with:
- Test name and date
- Hypothesis
- What was changed
- Results (including confidence level)
- Key learning
- Next action
This documentation becomes one of your most valuable marketing assets over time.
### Getting Started Today
You do not need a massive testing infrastructure to begin. Start with the channel where you have the most control and the fastest feedback loop, which for most businesses is email.
If you are using Brevo, you can set up your first A/B test in under five minutes within the campaign creation workflow. Test a subject line, let the platform select the winner automatically, and review the results. That single test will teach you more about your audience than weeks of internal debate.
When your emails are powered by real customer purchase data, you have far more meaningful elements to test than generic content ever provides.
The companies that win are not the ones with the best first guesses. They are the ones that test the most, learn the fastest, and compound their advantages over time. Start your first test today.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is A/B testing in email marketing?**
A/B testing (split testing) sends two versions of an email to small segments of your list to determine which performs better. The winning version is then sent to the remaining subscribers.
**What should I A/B test in emails?**
Start with subject lines (biggest impact), then test send times, CTAs, email design/layout, personalization, and content length. Test one variable at a time for clear results.
**How long should I run an A/B test?**
For email, test with 10-20% of your list for 2-4 hours before sending the winner. For landing pages, run tests for at least 1-2 weeks or until you reach statistical significance (95% confidence).
**How long should an A/B test run?**
Until you reach your required sample size or a minimum of one full business cycle (typically 7-14 days for web tests). For email A/B tests in tools like Brevo, the platform handles timing automatically. You set the test duration (commonly 1-4 hours for subject line tests), and the winning version goes to the remaining recipients.
**What is a good sample size for A/B testing?**
It depends on your baseline conversion rate and the minimum effect you want to detect. As a rough guide: to detect a 10% relative improvement on a 5% baseline with 95% confidence and 80% power, you need approximately 15,000 visitors per variation. For email tests, lists of 1,000+ subscribers per variation generally produce reliable results for open rate tests.
**Can I run multiple A/B tests at the same time?**
Yes, as long as the tests do not interact with each other. Running an email subject line test and a landing page headline test simultaneously is fine because they affect different parts of the funnel. Running two tests on the same landing page simultaneously can create interaction effects that confuse results.
**What is a statistically significant result?**
A result where the probability of the observed difference occurring by chance is less than your significance threshold, typically 5% (p < 0.05). This means you can be at least 95% confident that the difference is real and not due to random variation.
**How do I A/B test with a small audience?**
With smaller audiences, focus on testing elements with the largest potential effect size. Subject line tests can show meaningful differences with smaller lists because open rate differences tend to be larger. You can also extend test durations to accumulate more data, or use Bayesian statistical methods that handle small samples more gracefully.
**Should I always go with the statistically significant winner?**
Usually, but consider the full picture. If version B wins on clicks but version A wins on revenue, the "winner" depends on your business goal. Also consider the practical significance: a statistically significant 0.1% improvement may not be worth the implementation effort.
**What is the difference between A/B testing and personalization?**
A/B testing identifies which version performs best for your entire audience (or a segment). Personalization serves different content to different users based on their characteristics or behavior. The two work together: use A/B testing to determine which personalization strategies are most effective.
---
## Abandoned Cart Email: Templates, Examples & Recovery Strategies [2026]
Source: https://tajo.io/blog/abandoned-cart-email-guide/
Published: 2025-03-08 · Updated: 2026-05-08
Recover lost sales with effective abandoned cart emails. Get proven templates, timing strategies, and examples that convert abandoners into customers.
Summary: Around 70% of carts are abandoned, and a timed email sequence recovers 5 to 15% of them. Send the first reminder within an hour, follow with two more across three days, and hold the discount until the final message so you stop paying for sales you would have won anyway.
Every day, nearly 70% of online shopping carts are abandoned. That translates to approximately $18 billion in lost revenue annually for e-commerce businesses. But here's the good news: abandoned cart emails recover 5-15% of those lost sales, making them one of the highest-ROI marketing tools available.
In this comprehensive guide, you'll learn everything about abandoned cart emails: why customers abandon carts, the optimal timing for recovery emails, proven templates and sequences, discount strategies, and how to measure success. By the end, you'll have everything you need to build an abandoned cart recovery system that converts.
### What Is an Abandoned Cart Email?
An abandoned cart email is an automated message sent to shoppers who add items to their online shopping cart but leave without completing the purchase. These emails remind customers about their forgotten items and encourage them to return and complete the transaction.
Unlike promotional emails that go to your entire list, abandoned cart emails are highly targeted and triggered by specific customer behavior. This behavioral targeting is what makes them so effective, you're reaching people who have already demonstrated purchase intent.
#### Why Abandoned Cart Emails Work
- **High intent audience**: These shoppers already chose your products
- **Perfect timing**: You reach them when interest is still fresh
- **Relevance**: The email content matches their exact interests
- **Urgency potential**: Limited stock or expiring carts create natural urgency
The numbers prove it: abandoned cart emails have an average **45% open rate** and **21% click-through rate**, far exceeding standard promotional email benchmarks of 15-20% opens and 2-3% clicks.
### Why Do Customers Abandon Shopping Carts?
Understanding why customers abandon carts helps you craft more effective recovery emails. Here are the top reasons, backed by research:
#### 1. Unexpected Costs (48%)
Shipping fees, taxes, and additional charges added at checkout are the number one reason for cart abandonment. When customers see a higher total than expected, they often bail.
**Recovery strategy**: Address costs directly in your email. Offer free shipping thresholds or highlight that the quoted price includes all fees.
#### 2. Account Creation Required (24%)
Forcing customers to create an account before checkout adds friction. Many shoppers prefer guest checkout options.
**Recovery strategy**: Remind them that guest checkout is available, or highlight the benefits of creating an account (order tracking, faster future checkout).
#### 3. Complicated Checkout Process (18%)
Too many steps, confusing forms, or unclear progress indicators frustrate shoppers.
**Recovery strategy**: Provide a direct link back to checkout (not just the cart), and emphasize how easy completing the purchase is.
#### 4. Security Concerns (17%)
Customers hesitate if they don't trust a site with their payment information.
**Recovery strategy**: Include trust signals in your emails, security badges, payment icons, and mention of secure checkout.
#### 5. Just Browsing/Comparing (15%)
Some shoppers use carts as a wishlist or for comparison shopping across sites.
**Recovery strategy**: Provide additional value, product reviews, comparison content, or limited-time offers to create decision urgency.
#### 6. Payment Options (9%)
Limited payment methods or decline of preferred payment options cause abandonment.
**Recovery strategy**: Highlight all available payment options, including buy-now-pay-later services like Klarna or Afterpay.
#### 7. Technical Issues (4%)
Site errors, crashes, or slow loading drive customers away.
**Recovery strategy**: Apologize for any inconvenience and assure them the issue is resolved. Provide customer support contact.
### The Anatomy of a High-Converting Abandoned Cart Email
Every effective abandoned cart email contains these essential elements:
#### 1. Compelling Subject Line
Your subject line determines whether the email gets opened. The best abandoned cart subject lines:
- Reference the abandoned items specifically
- Create curiosity or urgency
- Feel personal, not promotional
**Top-performing subject line formulas:**
- "Did you forget something?" (Classic, 45%+ open rates)
- "Your [Product Name] is waiting for you"
- "Your cart is about to expire"
- "Still thinking about [Product Category]?"
- "Oops! You left [item] behind"
- "Complete your order and get [incentive]"
#### 2. Clear Product Reminder
Show the exact items left in the cart with:
- Product images (critical for visual impact)
- Product names and any variants (size, color)
- Prices (original and discounted if applicable)
- Quantity
#### 3. Single, Prominent CTA
Your call-to-action should be unmistakable:
- Use action-oriented text: "Complete My Order," "Return to Cart," "Finish Checkout"
- Make the button large and contrasting
- Place it above the fold and repeat it below
#### 4. Trust Signals
Reduce purchase anxiety with:
- Security badges and payment icons
- Return policy highlights
- Customer service contact information
- Customer reviews or ratings for the abandoned products
#### 5. Urgency Elements (Optional but Effective)
Create legitimate urgency:
- "Items in your cart are selling fast"
- "Low stock warning: Only 3 left"
- "Your cart expires in 24 hours"
- "Price guaranteed for limited time"
### Abandoned Cart Email Sequence: The Optimal Timing Strategy
A single abandoned cart email recovers some sales, but a strategic sequence dramatically improves results. Here's the proven timing framework:
#### The 3-Email Abandoned Cart Sequence
| Email | Timing | Purpose | Expected Recovery Rate |
|-------|--------|---------|----------------------|
| Email 1 | 1 hour | Gentle reminder | 5-8% |
| Email 2 | 24 hours | Create urgency | 3-5% |
| Email 3 | 72 hours | Final push + incentive | 2-4% |
**Total expected recovery: 10-17% of abandoned carts**
#### Email 1: The Reminder (1 Hour After Abandonment)
**Goal**: Catch customers who got distracted or had technical issues
**Tone**: Helpful, not pushy
**Content**:
- Simple reminder that items are waiting
- Product images and details
- Direct return-to-cart link
- No discount needed
**Why 1 hour?** This catches customers while their interest is still fresh. Many abandoners simply got distracted, a quick reminder brings them back.
#### Email 2: The Urgency Builder (24 Hours After Abandonment)
**Goal**: Create decision pressure for comparison shoppers
**Tone**: Slightly urgent, still helpful
**Content**:
- Stock warnings (if applicable)
- Cart expiration notice
- Social proof (product reviews, bestseller status)
- FAQ or objection handling
- Still no discount (typically)
**Why 24 hours?** This gives comparison shoppers time to research but catches them before they've moved on completely.
#### Email 3: The Final Push (72 Hours After Abandonment)
**Goal**: Convert hesitant buyers with added value
**Tone**: Urgent, value-focused
**Content**:
- Final reminder messaging
- Incentive offer (discount, free shipping)
- Customer testimonials
- Clear deadline for the offer
**Why 72 hours?** After three days, purchase intent drops significantly. This is your last effective touchpoint before moving to long-term nurturing.
### Abandoned Cart Email Templates
Here are ready-to-customize templates for each email in your sequence:
#### Template 1: The Gentle Reminder (Email 1)
**Why this template works:**
- Friendly, non-pushy tone
- Shows exact cart contents
- Single clear CTA
- Opens communication channel
#### Template 2: The Urgency Builder (Email 2)
**Why this template works:**
- Creates urgency with low stock warning
- Adds social proof with review
- Addresses common objections with FAQ
- Multiple psychological triggers
#### Template 3: The Incentive Offer (Email 3)
**Why this template works:**
- Clear incentive with code
- Shows savings calculation
- Creates urgency with expiration
- Final social proof reinforcement
- Multiple contact options for last objections
#### Template 4: High-Value Cart VIP Treatment
For carts above a certain threshold (e.g., $200+), use this elevated approach:
#### Template 5: The Problem-Solver (For Common Objections)
### Email Subject Lines That Convert
Your subject line is your first impression. Here are proven formulas organized by approach:
#### Curiosity-Based Subject Lines
- "Open this before your cart expires"
- "About your recent visit..."
- "Quick question about your order"
- "Something's missing from your order"
#### Urgency-Based Subject Lines
- "Your cart is expiring soon"
- "Going, going... almost gone"
- "Final hours: Your items are waiting"
- "[Product Name] is selling fast"
#### Personalized Subject Lines
- "[First Name], you left [Product] behind"
- "Still thinking about [Product Name]?"
- "[First Name], complete your [Brand] order"
- "Your [Product Category] is waiting"
#### Benefit-Focused Subject Lines
- "Complete your order + get free shipping"
- "15% off to finish your purchase"
- "Your exclusive discount inside"
- "We saved your cart (+ a surprise)"
#### Playful Subject Lines
- "Oops! Did you forget something?"
- "Your cart misses you"
- "Come back! (We saved your stuff)"
#### Test Results: What Actually Works Best
Based on aggregate data from millions of abandoned cart emails:
| Subject Line Type | Avg. Open Rate | Avg. Click Rate |
|------------------|----------------|-----------------|
| Simple Reminder | 42% | 18% |
| Urgency | 45% | 21% |
| With Discount | 48% | 25% |
| Personalized + Urgency | 52% | 24% |
### When to Offer Discounts (And When Not To)
Discounts can dramatically improve recovery rates, but they come with trade-offs. Here's how to use them strategically:
#### The Discount Dilemma
**Pros:**
- Higher conversion rates (up to 2x)
- Faster customer acquisition
- Clears abandoned inventory
**Cons:**
- Margin erosion
- Trains customers to abandon for discounts
- Can devalue brand perception
#### The Strategic Discount Framework
##### 1. Never Discount in Email 1
Your first abandoned cart email should never include a discount. Many abandoners simply got distracted, they'll convert without incentive. Offering discounts immediately trains customers to expect them.
##### 2. Reserve Discounts for Email 3
If you offer discounts, make them the "final push" in email 3 or later. This ensures you've already captured non-discount-driven conversions.
##### 3. Use Tiered Incentives Based on Cart Value
| Cart Value | Incentive Strategy |
|------------|-------------------|
| Under $50 | No discount, free shipping offer |
| $50-$150 | 10% off or free shipping |
| $150-$300 | 15% off + free shipping |
| $300+ | 15-20% off + free express shipping |
##### 4. Alternative Incentives That Protect Margins
Instead of price discounts, consider:
- **Free shipping** (often more effective than % off)
- **Free gift with purchase** (clears inventory)
- **Extended returns** (reduces risk)
- **Loyalty points bonus** (builds future value)
- **Exclusive product access** (creates value without discounting)
##### 5. Smart Discount Rules
Set up conditional logic in your automation:
- **First-time abandoners**: No discount
- **Repeat abandoners**: Discount on third sequence
- **High-value customers**: VIP treatment, not discounts
- **Low-stock items**: No discount needed (urgency suffices)
- **High-margin products**: Discount available
- **Low-margin products**: Alternative incentives only
Decision: Who abandoned, and what is in the cart?
- If First-time abandoner or low-stock item: No discount (Urgency or a reminder is enough.)
- If Repeat abandoner: Discount on the third sequence
- If High-value customer: VIP treatment, not discounts
- If High-margin product: Discount available
- If Low-margin product: Alternative incentives only (Free shipping, a gift, extended returns, loyalty points.)
#### Measuring Discount Effectiveness
Track these metrics to optimize your discount strategy:
- **Incremental revenue**: Sales from discount emails minus what you'd have earned without discount
- **Margin impact**: Net profit per recovered sale
- **Customer behavior**: Do discounted customers become repeat buyers?
- **Abandonment rate changes**: Are customers abandoning more frequently expecting discounts?
### Calculating Your Abandoned Cart Recovery ROI
Understanding the financial impact helps justify investment in cart recovery optimization.
#### Basic ROI Calculation
**Monthly Cart Abandonment Scenario:**
- Monthly website visitors: 50,000
- Add-to-cart rate: 10% = 5,000 carts created
- Cart abandonment rate: 70% = 3,500 abandoned carts
- Average cart value: $85
- Total abandoned value: $297,500/month
**Recovery Email Performance:**
- Email recovery rate: 10%
- Carts recovered: 350
- Revenue recovered: $29,750/month
- Annual recovery: $357,000
**Cost Analysis:**
- Email platform cost: $200/month
- Staff time (4 hours/month): $200
- Total cost: $400/month
- Annual cost: $4,800
**ROI Calculation:**
- Net revenue: $357,000 - $4,800 = $352,200
- ROI: 7,337%
#### Advanced ROI Factors
Consider these additional factors for a complete picture:
**Customer Lifetime Value (CLV) Impact:**
Recovered customers often become repeat buyers. If your average customer makes 3 purchases:
- Initial recovery: $29,750/month
- Future purchases: $59,500/month
- True monthly value: $89,250
**Opportunity Cost of No Recovery:**
Without abandoned cart emails, you lose not just immediate sales but:
- The entire future relationship
- Referral potential
- Upsell/cross-sell opportunities
#### Benchmarks for Cart Recovery Programs
| Metric | Average | Good | Excellent |
|--------|---------|------|-----------|
| Recovery rate | 5% | 10% | 15%+ |
| Email open rate | 40% | 50% | 60%+ |
| Click-to-open rate | 20% | 30% | 40%+ |
| Revenue per email | $3 | $5 | $8+ |
### Advanced Abandoned Cart Strategies
Once you've mastered the basics, these advanced tactics can further improve recovery rates:
#### 1. Dynamic Content Personalization
Go beyond [First Name] with:
- **Product recommendations**: "You might also like..." based on browse history
- **Category-specific messaging**: Different copy for fashion vs. electronics
- **Behavior-based urgency**: Show actual stock levels dynamically
- **Purchase history context**: "Complete the set" for existing customers
#### 2. Multi-Channel Recovery
Email alone leaves money on the table. Integrate:
- **SMS**: Short, urgent reminders 4-6 hours after abandonment
- **Push notifications**: For mobile app users
- **Retargeting ads**: Show abandoned products across the web
- **WhatsApp**: Personalized messages for high-value carts
**Multi-Channel Sequence Example:**
1. Email (1 hour) - Detailed reminder with images
2. SMS (4 hours) - "Your cart is waiting! Complete your order: [link]"
3. Email (24 hours) - Urgency + social proof
4. Retargeting ads (24-72 hours) - Show abandoned products
5. Email (72 hours) - Final offer with discount
6. SMS (72 hours) - "Final reminder: use SAVE10 for 10% off"
Sequence, triggered by: Cart abandoned
1. Email: Reminder
2. SMS
3. Email: Urgency
4. Retargeting ads
5. Email: Final offer
6. SMS
#### 3. Exit-Intent Prevention
Prevent abandonment before it happens:
- Exit-intent popups with small incentive
- Chat triggers when cursor moves toward close
- Progress saving with email capture
#### 4. Real-Time Cart Monitoring
Use live data to:
- Alert sales team for high-value cart abandonment
- Trigger phone calls for $500+ carts
- Send personalized video messages for VIP customers
#### 5. Segmented Sequences
Create different sequences for:
- **New visitors vs. returning customers**
- **Product category** (high consideration vs. impulse)
- **Cart value** (standard vs. VIP treatment)
- **Previous purchase history** (first-time vs. repeat)
### Common Abandoned Cart Email Mistakes to Avoid
Learn from others' mistakes to maximize your recovery rates:
#### 1. Waiting Too Long for the First Email
**Mistake**: Sending the first email 24+ hours after abandonment
**Why it fails**: Purchase intent drops significantly after the first hour
**Fix**: Send your first email within 60 minutes
#### 2. Not Including Product Images
**Mistake**: Text-only reminders without visual cart contents
**Why it fails**: Customers forget what they wanted; images trigger recall
**Fix**: Always include product images with details
#### 3. Too Many CTAs
**Mistake**: Multiple competing calls-to-action
**Why it fails**: Confused customers don't click anything
**Fix**: Single primary CTA, clear and prominent
#### 4. Generic Messaging
**Mistake**: "You have items in your cart" without specifics
**Why it fails**: Feels like spam, not relevant communication
**Fix**: Personalize with product names, customer name, specific details
#### 5. Discounting Too Early
**Mistake**: Offering 20% off in the first email
**Why it fails**: Trains customers to abandon for discounts; erodes margins
**Fix**: Reserve discounts for email 3+; use alternative incentives
#### 6. No Mobile Optimization
**Mistake**: Emails that look great on desktop, terrible on mobile
**Why it fails**: 60%+ of emails open on mobile
**Fix**: Single-column layouts, large buttons, readable text
#### 7. Ignoring Brand Voice
**Mistake**: Abandoned cart emails that sound corporate and cold
**Why it fails**: Feels disconnected from brand experience
**Fix**: Maintain your brand personality in all communications
#### 8. Not Testing
**Mistake**: Setting up one sequence and never optimizing
**Why it fails**: Leaves money on the table
**Fix**: Continuously A/B test subject lines, timing, content, offers
### Industry-Specific Abandoned Cart Examples
Different industries require different approaches. Here are tailored examples for key verticals:
#### Fashion and Apparel
Fashion abandonment often relates to sizing concerns or style uncertainty.
#### Electronics and Tech
Tech purchases involve more research and price comparison.
#### Beauty and Skincare
Beauty purchases benefit from education and results focus.
#### Home and Furniture
High-consideration items need extra trust building.
### Conclusion
Abandoned cart emails are one of the highest-ROI marketing investments you can make. With 70% of carts abandoned and proven recovery rates of 10-15%, the opportunity is significant.
Key takeaways for abandoned cart success:
1. **Send the first email within 1 hour** of abandonment
2. **Use a 3-email sequence** with escalating urgency
3. **Include product images and clear CTAs** in every email
4. **Reserve discounts for the final email** to protect margins
5. **Test continuously** to optimize performance
6. **Expand to multi-channel** for maximum recovery
The templates and strategies in this guide give you everything needed to start recovering lost sales today.
Every abandoned cart is a customer who wanted to buy from you. A well-crafted recovery email reminds them why, and makes it easy to complete the purchase.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is an abandoned cart email?**
An abandoned cart email is an automated message sent to shoppers who add items to their cart but leave without completing the purchase. These emails remind customers about forgotten items and typically recover 5-15% of abandoned carts.
**When should I send abandoned cart emails?**
The optimal timing is: first email within 1 hour of abandonment, second email after 24 hours, and a final email after 48-72 hours. Sending too quickly feels pushy, while waiting too long lets interest fade.
**Should I offer a discount in abandoned cart emails?**
Reserve discounts for your second or third email in the sequence. Start by simply reminding customers about their cart. If they don't respond, then offer a small incentive (5-10% off or free shipping) to close the sale.
**How many abandoned cart emails should I send?**
A 3-email sequence is the sweet spot: a reminder within 1 hour, a follow-up at 24 hours highlighting benefits/reviews, and a final urgency email with an incentive at 48-72 hours.
**What's the best time to send abandoned cart emails?**
The first email should go out within 1 hour of abandonment, this is critical for maximum recovery. Subsequent emails should follow at 24 hours and 72 hours. For send time optimization (morning vs. evening), test with your specific audience as results vary by industry and customer base.
**Do abandoned cart emails hurt my email reputation?**
No, when done correctly. Abandoned cart emails actually improve metrics because they're highly relevant and timely. The key is proper email authentication (SPF, DKIM, DMARC), clean lists, and easy unsubscribe options. High engagement rates from cart recovery emails can boost overall sender reputation.
**Should I send abandoned cart emails to everyone?**
You should send them to everyone who has opted in to marketing communications and abandoned a cart. However, segment your approach: new visitors might get different messaging than returning customers, and high-value carts might warrant different treatment than small orders.
**What discount should I offer in abandoned cart emails?**
Start with no discount in your first email, many customers convert without one. If you offer discounts, 10-15% is typical for the third email. For high-value carts, free shipping often converts better than percentage discounts. Always test what works for your margins and customers.
**How do I measure abandoned cart email success?**
Key metrics include: recovery rate (percentage of abandoned carts that convert), revenue recovered (total sales from the sequence), open rate (40-50% is good), click rate (15-25% is good), and ROI (compare recovered revenue to email program costs). Also track long-term impact on customer behavior.
**Can abandoned cart emails be used for B2B?**
Yes, but adapt the approach. B2B cart abandonment often involves longer consideration cycles and multiple stakeholders. Adjust timing (first email at 4-6 hours instead of 1 hour), focus on information over urgency, and consider personalized outreach for high-value opportunities.
**What should I do about customers who repeatedly abandon carts?**
Track abandonment behavior and create segments for serial abandoners. Options include: reducing email frequency, removing them from cart recovery (they may be using carts as wishlists), showing different messaging, or requiring action before seeing prices. Test different approaches for your audience.
**How do abandoned cart emails work with GDPR/privacy regulations?**
Abandoned cart emails typically fall under "legitimate interest" for existing customers who have made purchases or shown clear purchase intent. For new visitors, you need explicit consent to send marketing emails. Always include unsubscribe links, honor preferences, and consult legal counsel for your specific situation.
**Should my abandoned cart emails look like my regular marketing emails?**
They should feel consistent with your brand but may warrant a simpler design. Cart recovery emails perform well with clean, focused layouts that emphasize the abandoned products and CTA. Heavy promotional design can make them feel like generic marketing rather than helpful reminders.
---
## ActiveCampaign vs Mailchimp: Complete Feature and Pricing Comparison
Source: https://tajo.io/blog/activecampaign-vs-mailchimp/
Published: 2026-03-08 · Updated: 2026-05-07
Compare ActiveCampaign and Mailchimp for email marketing and automation.
Summary: ActiveCampaign leads on automation depth and its built-in CRM; Mailchimp leads on ease of use and template polish. Both bill per contact, so cost tracks list size rather than how often you send. For a Shopify store the deciding factor is usually how much order and catalog data actually reaches the platform.
When choosing an email marketing platform, ActiveCampaign and Mailchimp consistently rank among the top contenders. Both platforms serve millions of businesses worldwide, but they approach marketing automation from fundamentally different angles. This comprehensive comparison examines every aspect of both platforms to help you make an informed decision for your business.
Whether you are a small business owner exploring your first email marketing tool or a marketing professional evaluating a platform switch, this guide provides the detailed analysis you need.
### Quick Comparison Overview
| Feature | ActiveCampaign | Mailchimp |
|---------|----------------|-----------|
| **Primary Focus** | Marketing automation | Email marketing |
| **Automation Depth** | Advanced, CRM-integrated | Basic to intermediate |
| **CRM Capabilities** | Built-in CRM | Basic CRM (limited) |
| **SMS Marketing** | Included on higher tiers | US-only, separate product |
| **WhatsApp Marketing** | Limited integration | Not available |
| **E-commerce Features** | Via integrations | Native features |
| **Pricing Model** | Per-contact | Per-contact |
| **Best For** | Automation-focused B2B | Simple email campaigns |
| **Free Plan** | 14-day trial only | Yes (limited) |
### Platform Overview
#### ActiveCampaign
Founded in 2003, ActiveCampaign has evolved from a simple email marketing tool into a comprehensive customer experience automation platform. The company positions itself as an automation-first solution, offering sophisticated workflow builders, built-in CRM functionality, and sales automation tools.
ActiveCampaign serves over 185,000 businesses globally and is particularly popular among B2B companies, agencies, and businesses with complex sales cycles. The platform excels at creating multi-step automation sequences that respond to customer behavior across multiple touchpoints.
**Key Strengths:**
- Industry-leading automation builder with 900+ integrations
- Built-in sales CRM with pipeline management
- Site tracking and predictive content capabilities
- Machine learning for predictive sending and content optimization
- Robust conditional logic and branching in automations
- Lead scoring and contact management
- Sales automation beyond just marketing
#### Mailchimp
Mailchimp began in 2001 as a side project and grew into one of the most recognizable names in email marketing. Acquired by Intuit in 2021 for $12 billion, Mailchimp now serves over 13 million users worldwide. The platform has expanded beyond email to include landing pages, social media tools, and basic e-commerce features.
Mailchimp is known for its user-friendly interface and approachable design. The platform targets small businesses and entrepreneurs who need straightforward email marketing without a steep learning curve.
**Key Strengths:**
- Intuitive drag-and-drop editor with extensive templates
- Strong brand recognition and established reputation
- Free plan for beginners (up to 500 contacts)
- Built-in website builder and landing pages
- Social media posting and ads management
- Creative assistant with AI-powered design suggestions
- Simple customer journey builder
### Email Marketing Features
#### Email Builder and Design
**ActiveCampaign:**
ActiveCampaign provides a robust email builder with drag-and-drop functionality. The platform offers 250+ professionally designed templates organized by industry and campaign type. Advanced users can access HTML editing for complete customization.
The editor includes dynamic content blocks that change based on contact attributes, allowing you to personalize messages without creating multiple campaign versions. Conditional content sections can display different products, offers, or messages based on tags, custom fields, or list membership.
ActiveCampaign also offers predictive content, which uses machine learning to automatically select the content variation most likely to resonate with each recipient based on their past behavior and preferences.
**Mailchimp:**
Mailchimp's email builder is arguably more intuitive for beginners. The Creative Assistant feature uses AI to generate custom designs based on your brand assets, making it easy to create professional-looking emails without design experience.
The template library includes 100+ designs, though the variety is somewhat less than ActiveCampaign. Mailchimp's content blocks include features like product recommendations that automatically pull items from connected e-commerce stores.
The platform recently introduced generative AI capabilities for writing email copy, helping marketers overcome writer's block and create variations quickly.
**Verdict:** Mailchimp wins on ease of use; ActiveCampaign wins on advanced personalization and dynamic content capabilities.
#### Deliverability and Inbox Placement
**ActiveCampaign:**
ActiveCampaign consistently reports deliverability rates above 93% in industry tests. The platform includes dedicated IP addresses on higher plans and provides deliverability consulting for enterprise customers.
Features that support deliverability include:
- Automatic list hygiene and bounce management
- Predictive sending to optimize send times
- Spam testing before sending
- DKIM and SPF authentication
- Dedicated sending infrastructure
**Mailchimp:**
Mailchimp also maintains strong deliverability, typically reporting rates between 89-93% depending on the study. The platform benefits from its massive sending volume and established relationships with ISPs.
Deliverability features include:
- Automatic abuse detection
- Content analysis and recommendations
- Compliance warnings
- Authentication setup assistance
- List cleaning tools
**Verdict:** Both platforms offer strong deliverability. ActiveCampaign has a slight edge for high-volume senders who need dedicated IPs.
#### A/B Testing and Optimization
**ActiveCampaign:**
ActiveCampaign offers comprehensive split testing across multiple variables:
- Subject lines
- From names and addresses
- Email content
- Send times
- Entire automations
The platform allows up to five variations in a single test and can automatically send the winning variation to the remaining audience. Split testing within automations enables ongoing optimization of automated campaigns.
**Mailchimp:**
Mailchimp's A/B testing covers:
- Subject lines
- From names
- Content (on Standard plan and above)
- Send times
The testing interface is straightforward, but the platform limits tests to three variations. Multivariate testing (testing multiple variables simultaneously) requires the Premium plan.
**Verdict:** ActiveCampaign provides more comprehensive testing options and better integration with automation workflows.
### Automation Capabilities
#### Workflow Builder
**ActiveCampaign:**
This is where ActiveCampaign truly excels. The visual automation builder is among the most powerful in the industry, offering:
- **Split actions:** Create parallel paths based on conditions
- **Wait steps:** Delay based on time, date, or until conditions are met
- **If/else logic:** Branch automations based on any contact attribute
- **Goals:** End automations when contacts achieve specific outcomes
- **Attribution:** Track which automations generate conversions
- **Nested automations:** Trigger secondary automations from primary workflows
ActiveCampaign provides 900+ automation recipes (pre-built templates) covering common use cases from welcome series to cart abandonment to lead nurturing. Complex automations can include dozens of steps without performance issues.
The platform also offers site tracking, allowing automations to trigger based on specific page visits. Combined with event tracking, you can create highly sophisticated behavior-based sequences.
**Mailchimp:**
Mailchimp's automation capabilities have improved significantly but remain less sophisticated than ActiveCampaign. The Customer Journey Builder provides:
- Visual workflow creation
- Basic triggers (sign up, purchase, tag added)
- Time delays
- Simple branching (yes/no splits)
- Pre-built journeys for common scenarios
The automation builder is accessible and easy to learn, making it suitable for businesses with straightforward automation needs. However, complex branching logic, multiple conditions, and advanced triggers require workarounds or are simply not available.
Mailchimp limits certain automation features to higher-priced plans. Free and Essentials users have access to only basic autoresponders.
**Verdict:** ActiveCampaign wins decisively on automation power. Mailchimp is adequate for simple sequences but cannot match ActiveCampaign's sophistication.
#### Pre-Built Automation Templates
**ActiveCampaign:**
The platform includes 900+ automation templates covering:
- Welcome and onboarding series
- Abandoned cart recovery
- Lead nurturing sequences
- Re-engagement campaigns
- Customer win-back flows
- Birthday and anniversary messages
- Sales follow-up automations
- Webinar and event sequences
- Support ticket workflows
- Internal notification automations
**Mailchimp:**
Mailchimp offers approximately 50 pre-built customer journeys focusing on:
- Welcome emails
- Abandoned cart reminders
- Order confirmations
- Product follow-ups
- Re-engagement campaigns
- Birthday emails
- Date-based automations
**Verdict:** ActiveCampaign provides significantly more pre-built options, especially for B2B and sales-focused use cases.
### CRM and Contact Management
#### Built-In CRM
**ActiveCampaign:**
ActiveCampaign includes a full-featured CRM at no additional cost on Plus plans and above. The CRM offers:
- Visual deal pipelines (unlimited on higher tiers)
- Deal scoring and win probability
- Task management for sales teams
- Sales automation and sequences
- Lead scoring based on engagement
- Sales reports and forecasting
- Gmail and Outlook integration
- Calendar sync
- Sales activity tracking
For businesses that need both marketing automation and sales CRM, ActiveCampaign eliminates the need for separate tools. The integration between marketing and sales is seamless, with contacts flowing naturally from lead capture through deal closure.
**Mailchimp:**
Mailchimp offers basic CRM functionality but with significant limitations:
- Simple contact profiles
- Tags and segments
- Audience dashboard
- Basic revenue tracking
- Limited pipeline visualization
Mailchimp's CRM capabilities are suitable for tracking customer information and basic segmentation but lack the sales-focused features needed by teams with dedicated sales processes.
**Verdict:** ActiveCampaign's CRM is substantially more powerful and can replace dedicated CRM tools for many businesses.
#### Contact Segmentation
**ActiveCampaign:**
Segmentation in ActiveCampaign uses a powerful rules-based system supporting:
- Contact field values (standard and custom)
- Email engagement metrics
- Site visit behavior
- Automation history
- Deal information
- Event data
- E-commerce purchase history
- Lead scores
- Tags and lists
Segments update dynamically in real-time as contacts meet or no longer meet criteria. You can create complex segments using AND/OR logic with multiple conditions.
**Mailchimp:**
Mailchimp's segmentation includes:
- Signup source
- Email engagement
- E-commerce activity
- Location
- Tags
- Survey responses
- Predicted demographics
The Standard plan allows up to five conditions per segment; more complex segments require Premium. Advanced segmentation with nested logic is available but less intuitive than ActiveCampaign.
**Verdict:** ActiveCampaign offers more sophisticated segmentation with better real-time updating and deeper condition options.
### Pricing Comparison
#### ActiveCampaign Pricing
ActiveCampaign bases pricing on contact count and plan level:
| Plan | 1,000 Contacts | 5,000 Contacts | 10,000 Contacts |
|------|----------------|----------------|-----------------|
| Lite | $29/mo | $69/mo | $139/mo |
| Plus | $49/mo | $149/mo | $229/mo |
| Professional | $149/mo | $299/mo | $479/mo |
| Enterprise | Custom | Custom | Custom |
**What's included by plan:**
- **Lite:** Email marketing, automation, forms, segmentation
- **Plus:** CRM, lead scoring, SMS marketing, integrations
- **Professional:** Predictive content, split automations, attribution
- **Enterprise:** Custom reporting, dedicated support, custom domain
Note: ActiveCampaign does not offer a free plan, only a 14-day trial.
#### Mailchimp Pricing
Mailchimp also prices by contacts and features:
| Plan | 500 Contacts | 5,000 Contacts | 10,000 Contacts |
|------|--------------|----------------|-----------------|
| Free | $0 | N/A | N/A |
| Essentials | $13/mo | $69/mo | $110/mo |
| Standard | $20/mo | $100/mo | $170/mo |
| Premium | $350/mo | $350/mo | $350/mo |
**What's included by plan:**
- **Free:** Basic email, 500 contacts, 1,000 sends/month, limited features
- **Essentials:** Templates, A/B testing, basic automation, 3 audiences
- **Standard:** Customer journeys, send time optimization, behavioral targeting
- **Premium:** Advanced segmentation, multivariate testing, phone support
#### Cost Analysis
**Scenario 1: Small business with 2,500 contacts**
- ActiveCampaign Plus: ~$99/month
- Mailchimp Standard: ~$60/month
**Scenario 2: Growing business with 10,000 contacts**
- ActiveCampaign Plus: ~$229/month
- Mailchimp Standard: ~$170/month
**Scenario 3: Established business with 25,000 contacts**
- ActiveCampaign Plus: ~$399/month
- Mailchimp Standard: ~$350/month
#### Hidden Costs and Considerations
**ActiveCampaign:**
- CRM requires Plus plan or higher
- SMS marketing is an add-on with per-message pricing
- Dedicated IP costs extra
- No free plan limits initial exploration
**Mailchimp:**
- Audiences count toward contact limits even if unsubscribed
- Many features locked behind Standard or Premium
- Transactional email is a separate product
- Contact limits can trigger unexpected upgrades
**Verdict:** Mailchimp is generally less expensive for basic email marketing. ActiveCampaign provides better value when you factor in CRM and advanced automation needs.
### SMS and Multi-Channel Marketing
#### SMS Capabilities
**ActiveCampaign:**
SMS marketing is available on Plus plans and above as an add-on. Features include:
- SMS campaigns and automations
- Two-way messaging
- Link tracking
- MMS support
- Integration with email workflows
- Available in US, Canada, UK, and Australia
SMS credits are purchased separately and range from $0.01-$0.05 per message depending on country and volume.
**Mailchimp:**
Mailchimp's SMS offering is more limited:
- US-only availability
- Basic SMS campaigns
- Separate from email automations
- Limited automation triggers
- No two-way messaging
- Premium pricing per message
**Verdict:** ActiveCampaign offers better SMS capabilities with international availability, though both pale in comparison to dedicated multi-channel platforms.
#### WhatsApp Marketing
**ActiveCampaign:**
ActiveCampaign offers limited WhatsApp integration through third-party connections. The platform does not natively support WhatsApp Business API, requiring workarounds through Zapier or custom integrations.
**Mailchimp:**
Mailchimp does not offer WhatsApp marketing capabilities at all. Businesses requiring WhatsApp must use separate tools and manage channels independently.
**Verdict:** Neither platform adequately addresses WhatsApp marketing, a critical gap for businesses serving markets where WhatsApp dominates.
### E-Commerce Integration
#### Shopify and WooCommerce Support
**ActiveCampaign:**
ActiveCampaign integrates with major e-commerce platforms:
- Shopify (via third-party connector or API)
- WooCommerce (official integration)
- BigCommerce
- Square
E-commerce features include:
- Purchase tracking and abandoned cart triggers
- Product catalog sync for dynamic content
- Revenue attribution reporting
- Customer purchase history in contact records
- Basic RFM segmentation
However, ActiveCampaign's e-commerce integrations can require additional setup and may not sync all data automatically. The platform was designed primarily for B2B use cases, so e-commerce features feel somewhat added-on rather than native.
**Mailchimp:**
Mailchimp has invested heavily in e-commerce:
- Native Shopify integration
- Official WooCommerce plugin
- Direct BigCommerce connection
- Square integration
E-commerce features include:
- Order and purchase syncing
- Abandoned cart automations
- Product recommendations
- Purchase-based segmentation
- Revenue reports
- Predicted customer lifetime value
Mailchimp's e-commerce tools are more polished but still lack depth in areas like loyalty programs and advanced customer analytics.
**Verdict:** Mailchimp offers better native e-commerce integration; ActiveCampaign requires more configuration but provides more automation flexibility.
#### Loyalty and Retention Features
**ActiveCampaign:**
No native loyalty program features. Businesses must integrate third-party loyalty tools and manually trigger campaigns based on external data.
**Mailchimp:**
No native loyalty program features. Similar limitations to ActiveCampaign in this area.
**Verdict:** Neither platform addresses loyalty programs, leaving a significant gap for e-commerce businesses focused on retention.
### Support and Resources
#### Customer Support
**ActiveCampaign:**
- Email support on all plans
- Chat support on all plans
- Phone support on Professional and Enterprise
- Dedicated account manager on Enterprise
- Response time: typically within 24 hours
**Mailchimp:**
- Email support on paid plans only (not Free)
- Chat support on Essentials and above
- Phone support on Premium only
- Response time: varies significantly
**Verdict:** ActiveCampaign provides more accessible support across all plan levels.
#### Learning Resources
**ActiveCampaign:**
- ActiveCampaign University (free courses)
- Extensive documentation
- Community forum
- Regular webinars
- Certified consultant network
**Mailchimp:**
- Mailchimp 101 tutorials
- Help center articles
- Community forum
- Blog and resources
- Partner directory
**Verdict:** Both platforms offer comprehensive learning resources.
### When to Choose Each Platform
#### Choose ActiveCampaign If:
1. **Automation is your priority**
- You need complex, multi-step workflows
- Behavior-based triggers are essential
- You want to automate sales processes alongside marketing
2. **You need built-in CRM**
- Sales pipeline tracking is required
- You want marketing and sales in one platform
- Lead scoring is important for your business
3. **B2B or high-touch sales model**
- Long sales cycles with multiple touchpoints
- Need to nurture leads over time
- Want attribution tracking for campaigns
4. **Team collaboration is important**
- Multiple users with different permissions
- Need task assignment and management
- Want shared sales pipelines
#### Choose Mailchimp If:
1. **You are just starting out**
- Need a free plan to begin
- Want the easiest learning curve
- Simple email campaigns are sufficient
2. **Budget is the primary concern**
- Lower cost for basic email marketing
- Don't need advanced automation
- CRM is handled separately
3. **Design matters most**
- Want beautiful templates without design skills
- Creative Assistant AI appeals to you
- Brand consistency is a priority
4. **All-in-one simplicity**
- Website builder included
- Social posting in same platform
- Don't want to manage multiple tools
Decision: What does your business need most?
- If Automation, CRM, B2B sales cycles: ActiveCampaign (Multi-step workflows, lead scoring and a built-in sales CRM.)
- If Starting out, low budget, design: Mailchimp (Free plan, the easiest learning curve, Creative Assistant.)
### Making the Switch
#### Migration Considerations
**Data Export:**
- Contact lists with all custom fields
- Email templates you want to preserve
- Automation workflow documentation
- Segment definitions
**Setup Requirements:**
- Configure Brevo account
- Recreate key automations
- Set up tracking and integrations
**Transition Timeline:**
- Allow 2-4 weeks for setup and testing
- Run platforms in parallel initially
- Gradually migrate campaign sending
- Sunset old platform when confident
### Conclusion
ActiveCampaign and Mailchimp serve different segments of the market well. ActiveCampaign excels at sophisticated automation and CRM functionality, making it ideal for B2B businesses with complex sales cycles. Mailchimp provides an accessible entry point for small businesses needing straightforward email marketing.
However, for e-commerce businesses specifically, both platforms have significant limitations. Neither offers native WhatsApp marketing, both charge based on contact count (which becomes expensive at scale), and neither includes loyalty program functionality.
Ready to experience a better approach to e-commerce marketing?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**How does pricing compare between Activecampaign and Mailchimp?**
Pricing models differ between platforms. Compare based on your contact list size, sending volume, and required features to find the best value.
**Can I switch between Activecampaign and Mailchimp?**
Yes. Most platforms support data export/import. Migration typically involves transferring contacts, recreating key automations, and updating domain settings.
**Is ActiveCampaign better than Mailchimp for automation?**
Yes, ActiveCampaign offers significantly more sophisticated automation capabilities. The platform supports complex branching logic, multiple triggers, site tracking, and deep CRM integration that Mailchimp cannot match. For businesses that rely heavily on automation, ActiveCampaign is the clear choice between these two platforms.
**Does Mailchimp have a CRM?**
Mailchimp offers basic CRM functionality including contact profiles, tags, and simple audience management. However, it lacks the sales pipeline, deal tracking, and sales automation features found in dedicated CRM tools or ActiveCampaign's built-in CRM. Businesses with active sales processes typically need additional CRM software.
**Can I use SMS marketing with ActiveCampaign or Mailchimp?**
ActiveCampaign offers SMS marketing in select countries (US, Canada, UK, Australia) as an add-on to Plus plans and above. Mailchimp's SMS is limited to the US only. For businesses needing global SMS capabilities, alternative platforms like Brevo (200+ countries) provide better coverage.
**How do ActiveCampaign and Mailchimp compare on price?**
Mailchimp is generally less expensive for basic email marketing, especially with its free tier. However, when comparing similar feature sets (automation, CRM, SMS), ActiveCampaign often provides better value. Both charge based on contact count, which can become expensive for businesses with large lists. Brevo's per-email pricing model offers significant savings for businesses with many contacts.
**Does either platform support WhatsApp marketing?**
Neither ActiveCampaign nor Mailchimp offers native WhatsApp Business API support. ActiveCampaign allows limited integration through third-party tools, while Mailchimp has no WhatsApp capabilities. For businesses serving markets where WhatsApp is dominant, Brevo provides full WhatsApp marketing functionality.
**Which platform has better customer support?**
ActiveCampaign provides more accessible support across all plan levels, with email and chat support included on all plans and phone support on Professional and above. Mailchimp restricts support by plan, with email-only support on Essentials, chat on Standard, and phone reserved for Premium subscribers.
**Can I switch from ActiveCampaign to Mailchimp or vice versa?**
Yes, both platforms allow data export, and migration is possible. You can export contacts as CSV files and recreate templates and automations in the new platform. Allow 2-4 weeks for a complete migration, and consider running both platforms in parallel during the transition.
**How do deliverability rates compare?**
Both ActiveCampaign and Mailchimp maintain strong deliverability rates in the 89-95% range. ActiveCampaign offers dedicated IP addresses on higher plans, which can improve deliverability for high-volume senders. Proper list hygiene and engagement practices matter more than platform choice for most businesses.
---
## How to Create Advanced Marketing Funnels
Source: https://tajo.io/blog/advanced-marketing-funnels/
Published: 2024-09-20 · Updated: 2026-05-08
Master the art of building sophisticated, multi-channel marketing funnels that guide prospects through every stage of the customer journey, from awareness to advocacy, with personalized experiences and automated workflows.
Summary: Build an advanced funnel by mapping the stages from awareness to purchase, segmenting people by behavior, and connecting the message at each stage to the next action. Measure where prospects drop off before adding more steps.
Marketing funnels have evolved far beyond simple email sequences. Today's advanced funnels combine multiple channels, dynamic personalization, behavioral triggers, and sophisticated segmentation to create customer journeys that feel personal, timely, and relevant. When executed properly, advanced marketing funnels can increase conversion rates by 300% or more while reducing customer acquisition costs.
### Understanding Advanced Marketing Funnels
Traditional marketing funnels follow a linear path: awareness → interest → decision → action. Advanced funnels recognize that modern customer journeys are non-linear, with prospects entering at different stages, moving back and forth, and engaging across multiple channels before converting.
Advanced funnels incorporate:
- **Multi-channel orchestration**: Coordinating email, SMS, WhatsApp, social media, and web experiences
- **Dynamic personalization**: Adapting content based on behavior, preferences, and demographics
- **Behavioral triggers**: Responding to specific actions in real-time
- **Micro-conversions**: Optimizing for small commitments that lead to larger goals
- **Lifecycle stages**: Different strategies for prospects vs. customers vs. advocates
### The Anatomy of an Advanced Funnel
#### Top of Funnel (TOFU): Awareness & Education
**Objective**: Attract and educate potential customers
**Tactics:**
- Content marketing (blogs, videos, podcasts)
- Social media engagement
- SEO and organic traffic
- Paid advertising
- Lead magnets and free resources
**Key Metrics:**
- Traffic volume
- Engagement rate
- Lead capture rate
- Cost per lead
#### Middle of Funnel (MOFU): Consideration & Nurturing
**Objective**: Build trust and demonstrate value
**Tactics:**
- Email nurture sequences
- Educational webinars
- Case studies and testimonials
- Product comparisons
- Free trials or demos
**Key Metrics:**
- Email open and click rates
- Content engagement
- Time to next stage
- Lead scoring progression
#### Bottom of Funnel (BOFU): Decision & Conversion
**Objective**: Drive purchase decisions
**Tactics:**
- Personalized offers
- Sales consultations
- Limited-time promotions
- Risk reversal (guarantees, free returns)
- Social proof and urgency
**Key Metrics:**
- Conversion rate
- Average order value
- Cost per acquisition
- Sales cycle length
#### Post-Purchase: Retention & Advocacy
**Objective**: Maximize lifetime value and generate referrals
**Tactics:**
- Onboarding sequences
- Customer education
- Loyalty programs
- Upsell and cross-sell campaigns
- Referral incentives
**Key Metrics:**
- Customer lifetime value (CLV)
- Repeat purchase rate
- Net Promoter Score (NPS)
- Referral rate
### Building Advanced Funnels: Step-by-Step Framework
#### Step 1: Map the Customer Journey
Document every touchpoint and decision point:
1. **Identify personas**: Who are your ideal customers?
2. **Map awareness channels**: How do they discover you?
3. **Track consideration process**: What information do they need?
4. **Understand decision factors**: What drives purchase decisions?
5. **Plan post-purchase experience**: How do you retain and grow customers?
#### Step 2: Define Funnel Stages and Goals
Create clear definitions for each stage:
**Stage Definitions:**
- **Subscriber**: Opted into email list
- **Engaged Lead**: Opened 3+ emails or visited 5+ pages
- **Marketing Qualified Lead (MQL)**: Met specific engagement criteria
- **Sales Qualified Lead (SQL)**: Expressed purchase intent
- **Customer**: Made first purchase
- **Repeat Customer**: Made 2+ purchases
- **Advocate**: Provided referral or review
**Goals for Each Stage:**
Set specific conversion targets (e.g., "Convert 25% of subscribers to engaged leads within 30 days")
#### Step 3: Create Segmentation Strategy
Advanced funnels require sophisticated segmentation:
**Behavioral Segments:**
- Website activity (pages visited, time spent)
- Email engagement (opens, clicks, ignores)
- Purchase behavior (products bought, frequency, recency)
- Content preferences (topics engaged with)
**Demographic Segments:**
- Industry or job role
- Company size
- Geographic location
- Language preference
**Lifecycle Segments:**
- New subscribers
- Active prospects
- Customers (new, repeat, at-risk, churned)
- VIP customers
**Psychographic Segments:**
- Pain points and goals
- Buying motivations
- Risk tolerance
- Decision-making style
#### Step 4: Design Multi-Channel Workflows
Create coordinated experiences across channels:
**Email Sequences:**
Primary channel for detailed content and nurturing
**SMS Campaigns:**
High-urgency messages, appointment reminders, time-sensitive offers
**WhatsApp Messaging:**
Personalized conversations, customer support, order updates
**Retargeting Ads:**
Re-engage website visitors who didn't convert
**Social Media:**
Build community and extend reach
**Push Notifications:**
In-app engagement for mobile users
**Example Multi-Channel Flow:**
1. User downloads lead magnet → Welcome email (Day 0)
2. Educational email series (Days 2, 5, 8)
3. If email opens but no clicks → SMS with different angle (Day 10)
4. If clicks but doesn't convert → Retargeting ads + WhatsApp message (Day 14)
5. If converts → Onboarding sequence across email + SMS (Days 15+)
Sequence, triggered by: User downloads lead magnet
1. Welcome email
2. Educational email series
3. SMS with a different angle
4. Retargeting ads + WhatsApp message
5. Onboarding across email + SMS
#### Step 5: Implement Behavioral Triggers
Set up automated responses to user actions:
**Engagement Triggers:**
- Opened email → Send follow-up based on content
- Clicked specific link → Segment into interest category
- Watched video → Send related resource
- Downloaded resource → Trigger sales notification
**Website Behavior Triggers:**
- Visited pricing page 3+ times → Send pricing guide + discount
- Abandoned cart → Send cart recovery sequence
- Spent 5+ minutes on blog → Offer related lead magnet
- Returned after 30 days → Re-engagement campaign
**Milestone Triggers:**
- 7 days since signup → Check-in email
- 30 days without engagement → Win-back campaign
- 90 days after purchase → Replenishment reminder
- Anniversary → Special celebration offer
**Inactivity Triggers:**
- No email opens in 21 days → Re-engagement sequence
- No purchase in 90 days → Personalized offer
- Subscription about to expire → Renewal campaign
#### Step 6: Create Dynamic Content
Personalize experiences based on user data:
**Email Personalization:**
- Subject lines with name, company, or recent activity
- Dynamic product recommendations
- Location-specific content and offers
- Industry-specific case studies
**Landing Page Personalization:**
- Headlines that match ad copy or email subject
- Content adapted to traffic source
- Personalized offers based on customer segment
- Dynamic testimonials from similar customers
**Product Recommendations:**
- "Customers like you also bought..."
- Complementary product suggestions
- Replenishment reminders for consumables
- Upgrade paths based on current products
#### Step 7: Optimize for Micro-Conversions
Break the path to purchase into smaller commitments:
**Engagement Ladder:**
1. **Awareness**: Read blog post
2. **Interest**: Download resource
3. **Consideration**: Watch demo video
4. **Evaluation**: Request quote or start free trial
5. **Purchase**: Buy product
6. **Loyalty**: Join loyalty program
7. **Advocacy**: Refer a friend
Each step should feel like a natural, low-friction next action.
#### Step 8: Build Lead Scoring System
Prioritize leads based on fit and engagement:
**Demographic Scoring (Fit):**
- Right industry: +15 points
- Company size in target range: +10 points
- Job title is decision-maker: +20 points
- Geographic location: +5 points
**Behavioral Scoring (Engagement):**
- Email open: +3 points
- Email click: +7 points
- Website visit: +5 points
- Pricing page visit: +15 points
- Demo request: +50 points
- Downloaded case study: +10 points
**Negative Scoring (Disqualifiers):**
- Used free email domain: -10 points
- Unsubscribed: -50 points
- Job title non-relevant: -20 points
**Thresholds:**
- 0-25: Cold lead (automated nurture)
- 26-50: Warm lead (increased frequency)
- 51-75: Hot lead (sales notification)
- 76+: Sales-ready (immediate outreach)
Decision: What is the lead's score?
- If 0-25: Cold: automated nurture
- If 26-50: Warm: increase frequency
- If 51-75: Hot: notify sales
- If 76+: Sales-ready: reach out now
Note: Score adds fit (industry, size, title) and engagement (opens, clicks, pricing visits, demo requests), minus disqualifiers.
#### Step 9: Implement Testing Framework
Continuous optimization through systematic testing:
**Elements to Test:**
- Subject lines and preview text
- Email content and layout
- Call-to-action buttons
- Send times and frequency
- Offer positioning and pricing
- Landing page designs
- Channel mix and sequencing
**Testing Methodology:**
1. Identify high-impact variables
2. Form hypothesis (e.g., "Shorter subject lines will increase opens by 10%")
3. Create variations
4. Split traffic evenly
5. Run until statistical significance
6. Implement winner
7. Test next variable
#### Step 10: Set Up Advanced Analytics
Track performance across the entire funnel:
**Funnel Metrics:**
- Conversion rate at each stage
- Drop-off points and reasons
- Time in each stage
- Path analysis (common journeys)
**Channel Attribution:**
- First-touch attribution
- Last-touch attribution
- Multi-touch attribution
- Channel assists
**Revenue Metrics:**
- Customer acquisition cost (CAC)
- Customer lifetime value (CLV)
- Return on ad spend (ROAS)
- Revenue per email sent
**Engagement Metrics:**
- Email performance by segment
- Content engagement rates
- Cross-channel interaction patterns
- Response time metrics
### Advanced Funnel Strategies
#### 1. Intent-Based Funnels
Adapt funnel based on initial behavior:
**Information Seekers:**
- Started with blog content
- Funnel: Educational content → Comprehensive guides → Webinar → Soft offer
**Solution Shoppers:**
- Started with product pages
- Funnel: Product details → Comparison guide → Customer reviews → Discount offer
**Price Sensitive:**
- Started with pricing page
- Funnel: Value justification → ROI calculator → Payment options → Limited-time discount
**Ready to Buy:**
- Requested demo or quote
- Funnel: Immediate sales contact → Personalized proposal → Objection handling → Close
#### 2. Velocity-Based Funnels
Adjust based on engagement speed:
**Fast-Moving Leads:**
- Rapid engagement with multiple touchpoints
- Strategy: Accelerate sequence, reduce delays, prioritize for sales
**Slow-Moving Leads:**
- Sporadic engagement
- Strategy: Longer nurture period, more educational content, patience
**Stalled Leads:**
- Engaged initially, then stopped
- Strategy: Re-engagement campaign, change channels, offer something new
#### 3. Value-Based Funnels
Segment by potential customer value:
**High-Value Prospects:**
- Large company or high-intent signals
- Strategy: White-glove treatment, direct sales involvement, premium content
**Mid-Value Prospects:**
- Standard target customer
- Strategy: Standard automation with selective human touch
**Low-Value Prospects:**
- Small company or low-intent
- Strategy: Fully automated, self-service resources
#### 4. Lifecycle Funnels
Different funnels for different customer stages:
**New Customer Funnel:**
- Onboarding and activation
- Goal: Successful first use, quick wins
**Growth Funnel:**
- Feature adoption and expansion
- Goal: Increase usage, upsell
**Retention Funnel:**
- Engagement and satisfaction
- Goal: Prevent churn, renew subscriptions
**Win-Back Funnel:**
- Re-engage churned customers
- Goal: Reactivation with improved offering
**Advocacy Funnel:**
- Leverage happy customers
- Goal: Reviews, referrals, case studies
#### 5. Event-Triggered Funnels
Launch funnels based on specific events:
**Product Launch:**
- Tease → Announce → Early access → General availability → Testimonials
**Seasonal Campaigns:**
- Pre-season awareness → Peak season promotion → End-of-season clearance
**Company Milestones:**
- Anniversary sale → Customer appreciation → New features announcement
**External Events:**
- Industry conference attendance → Post-event follow-up
- Market changes → Timely solution positioning
### Common Mistakes to Avoid
#### 1. Over-Automation
Not every touchpoint should be automated. High-value prospects and critical moments require human involvement.
#### 2. Generic Messaging
Advanced funnels require advanced personalization. Generic messages kill conversion.
#### 3. Ignoring Mobile
Over 60% of emails are opened on mobile. Ensure every asset is mobile-optimized.
#### 4. Focusing Only on Acquisition
Post-purchase funnels often deliver higher ROI than acquisition funnels. Don't neglect retention.
#### 5. Lack of Testing
Assumptions lead to suboptimal performance. Test everything systematically.
#### 6. Poor Timing
Sending too frequently annoys; too infrequently causes disengagement. Find the right cadence for each segment.
#### 7. No Clear Exit Paths
Let people unsubscribe from sequences they're not interested in without leaving your list entirely.
### Measuring Funnel Success
**Key Performance Indicators:**
**Efficiency Metrics:**
- Overall conversion rate (visitors → customers)
- Stage-by-stage conversion rates
- Average time to convert
- Cost per acquisition
**Revenue Metrics:**
- Revenue per visitor
- Average order value
- Customer lifetime value
- Return on marketing investment
**Engagement Metrics:**
- Email engagement rates by stage
- Content consumption
- Multi-channel engagement rate
**Quality Metrics:**
- Customer satisfaction
- Product adoption rate
- Churn rate
- Referral rate
### Scaling Your Funnels
As your business grows, scale your funnel infrastructure:
**Operational Scaling:**
- Document all workflows
- Create templates for common funnels
- Establish governance and approval processes
- Train team members on funnel management
**Technical Scaling:**
- Ensure platform can handle volume
- Optimize for performance
- Implement proper data management
- Set up redundancy and backups
**Content Scaling:**
- Build content libraries
- Create modular content blocks
- Establish brand guidelines
- Implement content calendars
**Personalization Scaling:**
- Expand segmentation
- Develop more dynamic content
- Implement AI-powered recommendations
- Create persona-specific journeys
### The Future of Marketing Funnels
Emerging trends shaping advanced funnels:
- **AI-powered optimization**: Machine learning automatically optimizes send times, content, and channel selection
- **Predictive analytics**: Anticipate customer needs before they express them
- **Conversational funnels**: Chat and voice interfaces integrated into traditional funnels
- **Privacy-first personalization**: Effective personalization without invasive tracking
- **Unified customer experiences**: Seamless transitions between digital and physical touchpoints
### Conclusion
Creating advanced marketing funnels is both an art and a science. It requires strategic thinking, technical implementation, creative content, and continuous optimization. The effort is worthwhile, well-designed funnels can dramatically improve conversion rates, reduce acquisition costs, and increase customer lifetime value.
Start by mapping your current customer journey, identify the highest-impact improvements, and implement systematically.
Remember that funnels are never "finished." The best marketing teams continuously test, learn, and refine their funnels based on performance data and changing customer behavior. By adopting this mindset of constant improvement, you'll build marketing funnels that drive sustainable business growth.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is create advanced marketing funnels?**
Master the art of building sophisticated, multi-channel marketing funnels that guide prospects through every stage of the customer journey, from awareness to advocacy, with personalized experiences and automated workflows.
**Why is create advanced marketing funnels important?**
Create Advanced Marketing Funnels helps businesses improve customer engagement, streamline operations, and drive growth through effective strategies and tools.
**How do I implement create advanced marketing funnels?**
Start by understanding your goals, choose the right tools, and implement in phases. Many platforms offer free trials to test before committing.
---
## Affordable Email Marketing Guide: Pricing Models, Free Plans, Automation, and Upgrade Signals (2026)
Source: https://tajo.io/blog/affordable-email-marketing-guide/
Published: 2025-03-08 · Updated: 2026-05-16
Compare affordable email marketing options by pricing model, free-plan limits, automation depth, contact storage, deliverability, and when it makes sense to upgrade.
Summary: Affordable email marketing is about value, not the lowest sticker price. Compare send-volume pricing against contact-based pricing, then check free-plan caps, automation gates, deliverability controls, and the upgrade point where your actual cost changes.
Email marketing remains one of the highest-return channels available, and you do not need a large budget to run it well. The challenge for small businesses is not finding a cheap tool. It is finding the right balance of cost, capability, and deliverability so that every dollar you spend actually reaches an inbox and drives a result.
This guide explains what makes email marketing genuinely affordable in 2026, compares the leading budget-friendly platforms, and lays out the strategies that cut cost without cutting results.
### What "affordable" actually means
The cheapest plan on paper is often not the cheapest in practice. Affordability comes down to the pricing model and the hidden costs underneath it.
#### Pricing models compared
| Pricing model | How it works | Best for | Watch out for |
|---------------|--------------|----------|---------------|
| Per-email | Pay by emails sent | Large lists, moderate frequency | Cost rises with send volume |
| Per-contact | Pay by list size | Frequent senders, smaller lists | Paying for inactive subscribers |
| Flat-rate | Fixed monthly fee | Predictable budgeting | Feature ceilings |
| Pay-as-you-go | Buy email credits | Sporadic senders | Expensive at scale |
| Freemium | Free tier, paid upgrades | Beginners and testing | Limited features, branding |
The key distinction is per-email versus per-contact. Per-contact platforms charge you more as your list grows, even for subscribers who never open anything. Per-email platforms (Brevo is the clearest example) let your list grow for free and only charge when you send, which suits businesses with big lists and moderate frequency.
#### Hidden costs to check
- **Overage charges** when you exceed a plan limit
- **Add-on features** where automation, segmentation, or reporting cost extra
- **Branding removal** locked behind a paid tier
- **Integration fees** to connect your store or CRM
- **Support tiers** where faster help costs more
A platform that looks cheap at signup can become the most expensive once these stack up.
### Affordable email platform shortlist for 2026
Pricing shifts often, so treat this as a fit guide and confirm current free-plan limits, send tiers, subscriber caps, branding rules, and automation gates on each vendor's pricing page.
| Platform | Pricing model to verify | Strongest at | Check before choosing |
|----------|-------------------------|--------------|----------------------|
| Brevo | Send-volume tiers with unlimited contacts | Multi-channel email, SMS, WhatsApp, CRM | Daily or monthly send limits, advanced feature gates |
| MailerLite | Subscriber tiers plus send limits | Simple newsletters, landing pages, automation | Subscriber caps and feature differences by tier |
| Kit | Creator and newsletter tiers | Creators, paid newsletters, audience products | Subscriber thresholds and commerce features |
| Mailchimp | Contact tiers and monthly send limits | Familiar editor, templates, integrations | Contact counting rules, automation depth, SMS availability |
| Moosend | Subscriber tiers | Budget automation and ecommerce campaigns | Trial/free structure, support, advanced feature access |
| Benchmark Email | Contact or send-based options depending on plan | Simple campaigns and small teams | Send caps, branding, automation limits |
#### Brevo
Brevo's send-volume model is what makes it stand out for affordability. You pay primarily for sends, not for how many contacts you store, so a business with a large list and moderate frequency can avoid the inactive-subscriber tax that comes with contact-based tools. The same account can also cover email, SMS, WhatsApp, CRM, and transactional email, which matters when a "cheap email tool" would otherwise require several paid add-ons.
#### MailerLite
MailerLite pairs a generous entry path with one of the cleanest interfaces on the market. Automation, landing pages, and signup forms are the core appeal. It is usually best for teams that want to launch quickly and do not need deep CRM, SMS, WhatsApp, or complex revenue attribution.
#### Kit
Kit is worth checking when "affordable" also means creator-friendly. Its strengths are newsletters, landing pages, audience tagging, and creator monetization. It is less compelling if you need ecommerce purchase data, SMS, WhatsApp, or a sales CRM in the same system.
#### Mailchimp
Mailchimp remains familiar and easy to buy, but it is not automatically the lowest-cost option anymore. Confirm how contacts are counted, what the free plan includes, and when automation, testing, support, or multichannel features require an upgrade.
### Cost-saving strategies that work on any plan
Choosing the right platform is half the work. These habits cut cost further and improve results at the same time.
#### 1. Keep your list clean
Remove hard bounces immediately, suppress repeat soft bounces, and move long-inactive contacts into a re-engagement track or out of the list. On per-contact pricing, removing dead weight can save real money every month, and on every platform it protects your sender reputation.
#### 2. Segment instead of blasting
Sending everything to everyone costs more and performs worse. Segment by engagement, behavior, and lifecycle stage, then send the right message to the right slice. Targeted sends to smaller [segments](/blog/email-segmentation-guide/) often cut total volume substantially while lifting open and click rates.
#### 3. Match frequency to engagement
| Segment | Suggested cadence |
|---------|-------------------|
| Highly engaged | Weekly or more |
| Moderately engaged | Every two weeks |
| Low engagement | Monthly or re-engagement only |
| New subscribers | Welcome series, then adjust |
#### 4. Let automation do the work
A handful of [automated workflows](/blog/email-marketing-automation-workflows/) run themselves and consistently outperform manual sends. Prioritize the ones with the clearest payback: a [welcome series](/blog/welcome-email-guide/), [abandoned cart recovery](/blog/abandoned-cart-email-guide/), a [post-purchase sequence](/blog/post-purchase-email-guide/), and a [re-engagement flow](/blog/re-engagement-email-guide/).
#### 5. Protect deliverability
Email that lands in spam is money spent on nothing. Authenticate your domain with SPF, DKIM, and DMARC, use [double opt-in](/blog/double-opt-in-guide/), keep sending patterns consistent, and watch your bounce and complaint rates.
### Choosing the right platform for your situation
Use a few quick filters:
- **List size.** Small lists with light sending can often start on a free or low-cost MailerLite, Kit, Benchmark Email, or Mailchimp tier. Large list, moderate frequency? Brevo's per-email model usually wins on cost.
- **Use case.** Ecommerce leans toward Brevo when you want email, SMS, WhatsApp, CRM, and transactional messaging in one account. Content and blogging suit MailerLite or Kit. Simple campaign sending can fit Benchmark Email or Moosend.
- **Budget at scale.** Project cost at the list size you expect in a year, not today. The cheapest plan now can become the priciest once contact tiers, send limits, and add-ons kick in.
Decision: How big is your list, and what are you sending?
- If Small list, light sending: A free or low-cost MailerLite, Kit, Benchmark Email or Mailchimp tier (Contact tiers stay cheap while the list is small.)
- If Large list at moderate frequency, or ecommerce wanting every channel in one account: Brevo (Per-email pricing lets the list grow for free.)
- If Content and blogging: MailerLite or Kit (Newsletters, landing pages and audience tagging.)
- If Simple campaign sending: Benchmark Email or Moosend (Straightforward campaigns for small teams.)
Note: Project cost at the list size you expect in a year, not today.
### Affordable email marketing for ecommerce
Ecommerce gets the most from email because the highest-return automations are tied directly to purchase behavior: cart recovery, browse abandonment, post-purchase, and win-back. These pay for themselves quickly, which is why an affordable stack matters more than a cheap one.
For a Shopify store on a budget, the lean stack looks like this:
| Component | Affordable solution |
|-----------|---------------------|
| Email marketing | Brevo (free to low monthly) |
| SMS and WhatsApp | Brevo (pay per message) |
Assembling separate tools for email, SMS, integration, and loyalty can create avoidable subscription overlap.
### Common affordable email marketing mistakes
- **Choosing on price alone.** The cheapest tool can cost more in workarounds, missing features, and migration later.
- **Ignoring deliverability.** A $10 tool that lands in spam is more expensive than a $25 tool that reaches the inbox.
- **Skipping automation.** Manual sending eats time, and time is cost. Set up the core flows even on a free plan.
- **Letting the list rot.** Inactive subscribers drag down both your bill and your reputation.
- **Over-engineering early.** You do not need enterprise segmentation while the list is still small. Start simple and grow into features.
### The bottom line
Affordable email marketing is not about finding the cheapest tool. It is about matching the pricing model to how you actually send, keeping your list and deliverability healthy, and letting automation carry the load. Start on a free tier that fits your real list and send volume, focus on the fundamentals, and upgrade only when you hit a real limit.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is the most affordable email marketing platform?**
The most affordable platform depends on how you send. Brevo is often cost-effective for larger lists because it prices by email volume rather than contacts stored. MailerLite, Kit, Moosend, Benchmark Email, and Mailchimp can fit smaller lists depending on current free-plan and paid-tier limits.
**Can I do effective email marketing for free?**
Yes, if your list and send volume are small. Free plans usually cap daily or monthly sends, subscribers, automation features, branding removal, support, or reporting, so confirm the current limit before relying on a free tier for production campaigns.
**How much should a small business budget for email marketing?**
Budget from your actual list size, send frequency, and required features. A small list can often start free, while growing teams should model cost at the next two list or send-volume milestones before choosing a platform.
---
## The Complete Guide to AI Tool Implementation
Source: https://tajo.io/blog/ai-tool-implementation-guide/
Published: 2024-09-30 · Updated: 2026-05-21
A comprehensive, step-by-step framework for successfully selecting, deploying, and optimizing AI tools in your organization, from initial evaluation through long-term management and ROI maximization.
Summary: AI tool rollouts fail on process, not technology. Evaluate against one named business outcome, pilot with a small group before committing, budget for change management and retraining, then measure adoption and ROI on a fixed cadence instead of assuming the rollout stuck.
AI tools promise to transform how businesses operate, but the gap between promise and reality is filled with failed implementations, abandoned projects, and disappointed stakeholders. The difference between success and failure rarely comes down to the technology itself, it's about how you implement it. This guide provides a complete framework for successfully deploying AI tools that deliver measurable business value.
### Why AI Tool Implementations Fail
Understanding failure modes helps you avoid them:
#### Common Failure Patterns
**1. Solution in Search of a Problem**
Implementing AI because it's trendy, not because it solves a real business need.
**2. Unrealistic Expectations**
Believing AI will magically solve complex problems without proper data, integration, or change management.
**3. Poor Data Foundation**
Underestimating data quality requirements and the work needed to prepare data for AI.
**4. Insufficient Stakeholder Buy-In**
Technical team excited, business users resistant, executives ambivalent, recipe for failure.
**5. Lack of Clear Success Metrics**
Not defining what success looks like makes it impossible to achieve or demonstrate value.
**6. Inadequate Change Management**
Focusing on technology while ignoring the people and process changes required.
**7. Integration Challenges**
Underestimating the complexity of connecting AI tools to existing systems.
**8. Vendor Lock-In**
Choosing proprietary solutions that make switching prohibitively expensive.
### The AI Tool Implementation Framework
Sequence, triggered by: A business problem worth solving
1. Discovery and planning
2. Preparation
3. Implementation
4. Optimization
#### Phase 1: Discovery and Planning (Weeks 1-4)
##### Step 1: Define Business Objectives
Start with business outcomes, not technology features.
**Good Objectives:**
- Reduce customer service costs by 30% while maintaining satisfaction
- Increase sales conversion rates by 20%
- Decrease fraud losses by 50%
- Improve customer retention by 15%
**Poor Objectives:**
- "We need AI"
- "Implement machine learning"
- "Use the latest technology"
**Framework:**
- What business problem are you solving?
- What's the current cost of this problem?
- What would success look like?
- How will you measure improvement?
- What's the expected ROI and timeline?
##### Step 2: Assess Current State
Understand your starting point:
**Process Assessment:**
- Document current workflows
- Identify pain points and bottlenecks
- Map data flows
- Measure baseline performance
**Technical Assessment:**
- Inventory existing systems
- Evaluate integration capabilities
- Assess data quality and availability
- Review infrastructure capacity
**Organizational Assessment:**
- Identify stakeholders and decision-makers
- Evaluate AI/technical expertise
- Understand culture and change readiness
- Assess budget and resource availability
##### Step 3: Research AI Solutions
Explore available options systematically:
**Categories to Consider:**
- Pre-built SaaS solutions (fastest deployment)
- Platform-as-a-Service (PaaS) requiring customization
- Custom development (most flexible, most expensive)
- Hybrid approaches
**Evaluation Criteria:**
**Functionality:**
- Does it solve your specific problem?
- What's included out-of-box vs. customization?
- Are there feature gaps?
- Roadmap alignment with your needs?
**Integration:**
- Pre-built connectors to your stack?
- API quality and documentation?
- Webhook support?
- Data import/export capabilities?
**Scalability:**
- Performance at your expected volume?
- Pricing at scale?
- Geographic expansion support?
- Technical limitations?
**Vendor Stability:**
- Company financial health?
- Customer references and case studies?
- Market position and competition?
- Support and SLA commitments?
**Total Cost of Ownership:**
- Licensing/subscription fees
- Implementation costs
- Training requirements
- Ongoing maintenance
- Integration development
- Exit costs if you switch
##### Step 4: Build the Business Case
Quantify expected value and costs:
**Cost Analysis:**
```
One-Time Costs:
- Software licenses: $X
- Implementation services: $Y
- Integration development: $Z
- Training and change management: $W
Total: $T
Annual Recurring Costs:
- Subscription fees: $A
- Maintenance and support: $B
- Additional staff: $C
Total Annual: $R
```
**Benefit Analysis:**
```
Efficiency Gains:
- Hours saved annually: H hours
- Cost per hour: $C
- Annual savings: H × $C = $S
Revenue Impact:
- Increased conversion: %
- Expected revenue lift: $R
Risk Reduction:
- Error cost reduction: $E
- Compliance improvement: $O
Total Annual Benefit: $S + $R + $E + $O = $B
```
**ROI Calculation:**
```
Year 1 ROI = ($B - $R - $T) / ($T + $R) × 100%
3-Year ROI = (3 × $B - 3 × $R - $T) / ($T + 3 × $R) × 100%
Payback Period = $T / ($B - $R) years
```
##### Step 5: Select AI Tool
Make the final selection:
**Create Shortlist:**
Narrow to 2-3 finalists based on evaluation criteria.
**Conduct Pilots:**
- Request demos with your data
- Run proof-of-concept projects
- Test integration complexity
- Evaluate user experience
- Measure actual performance
**Reference Checks:**
- Talk to current customers
- Ask about implementation challenges
- Understand ongoing support quality
- Learn about unexpected costs
**Final Decision:**
Consider:
- Best fit for requirements
- Total cost of ownership
- Implementation risk
- Long-term strategic alignment
- Vendor partnership potential
#### Phase 2: Preparation (Weeks 5-8)
##### Step 6: Assemble Implementation Team
**Core Team Roles:**
**Executive Sponsor:**
- Provides authority and resources
- Removes organizational barriers
- Communicates importance to organization
**Project Manager:**
- Manages timeline and deliverables
- Coordinates across teams
- Tracks budget and risks
**Technical Lead:**
- Oversees integration and configuration
- Makes architectural decisions
- Manages technical resources
**Business Lead:**
- Defines requirements and acceptance criteria
- Manages change management
- Ensures business value delivery
**Data Lead:**
- Ensures data quality and availability
- Manages data privacy and compliance
- Designs data pipelines
**Change Management Lead:**
- Drives user adoption
- Manages training and communication
- Addresses resistance
**Subject Matter Experts:**
- Provide domain expertise
- Validate AI outputs
- Design workflows
##### Step 7: Prepare Data
Data preparation is typically 60-80% of the effort:
**Data Collection:**
- Identify all required data sources
- Establish data access and permissions
- Extract historical data for training
- Set up ongoing data pipelines
**Data Cleaning:**
- Remove duplicates
- Fix formatting inconsistencies
- Handle missing values
- Correct obvious errors
- Standardize formats
**Data Transformation:**
- Normalize values
- Create derived features
- Aggregate as needed
- Join data from multiple sources
**Data Labeling:**
For supervised learning:
- Define clear categories
- Create labeling guidelines
- Label training examples
- Validate label quality
- Consider outsourcing if volume is high
**Data Security:**
- Anonymize sensitive data
- Implement access controls
- Ensure compliance (GDPR, CCPA, etc.)
- Document data lineage
##### Step 8: Design Implementation Plan
**Phase Approach:**
**Phase 1: Foundation (Weeks 9-12)**
- Set up infrastructure
- Configure basic tool settings
- Establish integrations
- Conduct initial training
**Phase 2: Pilot (Weeks 13-16)**
- Deploy to limited user group
- Test with real data
- Gather feedback
- Iterate and refine
**Phase 3: Rollout (Weeks 17-24)**
- Gradual expansion to all users
- Monitor performance closely
- Provide hands-on support
- Address issues quickly
**Phase 4: Optimization (Ongoing)**
- Continuous improvement
- Advanced feature adoption
- Process refinement
- ROI tracking
##### Step 9: Develop Training Program
**Training Levels:**
**Executive Overview (1 hour):**
- Strategic value of AI tool
- High-level capabilities
- Expected business impact
- Their role in success
**End User Training (4-8 hours):**
- How to use the tool daily
- Workflow changes
- Best practices
- Troubleshooting common issues
**Power User Training (2-3 days):**
- Advanced features
- Configuration options
- Integration management
- Reporting and analytics
**Administrator Training (3-5 days):**
- Full system configuration
- User management
- Integration setup
- Troubleshooting and support
**Training Formats:**
- Live instructor-led sessions
- Recorded video tutorials
- Interactive documentation
- Hands-on labs
- Office hours for questions
#### Phase 3: Implementation (Weeks 9-24)
##### Step 10: Set Up Infrastructure
**Technical Setup:**
- Provision cloud resources
- Configure security settings
- Set up user authentication
- Establish backup and recovery
- Implement monitoring
**Integration Development:**
- Build API connections
- Configure webhooks
- Set up data synchronization
- Test integration reliability
- Implement error handling
**Testing:**
- Unit testing of components
- Integration testing across systems
- Performance testing at expected load
- Security and penetration testing
- User acceptance testing
##### Step 11: Configure AI Tool
**Initial Configuration:**
- Company and user setup
- Workflow configuration
- Business rules and logic
- Templates and content
- Notification settings
**AI Model Training:**
For tools requiring training:
- Load training data
- Configure model parameters
- Train initial models
- Validate accuracy
- Tune for performance
**Quality Assurance:**
- Test with real scenarios
- Validate outputs
- Check edge cases
- Verify integrations
- Confirm reporting accuracy
##### Step 12: Pilot Deployment
**Pilot Selection:**
Choose representative but low-risk group:
- Enthusiastic early adopters
- Representative use cases
- Manageable volume
- Clear success criteria
- Feedback-oriented users
**Pilot Execution:**
- Deploy to pilot group
- Provide intensive support
- Monitor usage and performance
- Collect detailed feedback
- Iterate rapidly based on learnings
**Pilot Success Criteria:**
- Adoption rate (% actively using)
- Performance metrics (speed, accuracy)
- User satisfaction (surveys, feedback)
- Business impact (KPIs)
- Issue resolution time
**Go/No-Go Decision:**
Evaluate whether to proceed to full rollout based on:
- Pilot success criteria met?
- Critical issues resolved?
- User feedback positive?
- Business case validated?
- Organization ready for expansion?
##### Step 13: Full Rollout
**Phased Approach:**
**Week 1-2: Department 1**
- Deploy to first department
- Intensive support and monitoring
- Daily check-ins
- Quick issue resolution
**Week 3-4: Department 2**
- Incorporate learnings from Department 1
- Continue support and monitoring
- Build internal expertise
**Week 5-8: Remaining Departments**
- Accelerate rollout pace
- Leverage trained users as champions
- Maintain support availability
Sequence, triggered by: Pilot passes the go/no-go decision
1. Department 1
2. Department 2
3. Remaining departments
**Communication Plan:**
- Pre-rollout: What's coming, when, and why
- During rollout: Progress updates, success stories
- Post-rollout: Results, next steps, ongoing support
**Support Structure:**
- Help desk for questions
- Office hours for live assistance
- Documentation and FAQs
- Escalation path for issues
- Feedback mechanism
#### Phase 4: Optimization (Ongoing)
##### Step 14: Monitor Performance
**Technical Metrics:**
- System uptime and reliability
- Response time and latency
- Error rates
- API call volume
- Data sync status
**Usage Metrics:**
- Active users
- Feature adoption
- Session frequency and duration
- Most/least used features
**Business Metrics:**
- KPIs defined in planning phase
- Efficiency improvements
- Cost savings
- Revenue impact
- Customer satisfaction
**AI-Specific Metrics:**
- Prediction accuracy
- False positive/negative rates
- Model confidence scores
- Training data quality
- Model drift detection
**Monitoring Tools:**
- Real-time dashboards
- Automated alerts for anomalies
- Weekly/monthly reports
- Trend analysis
- Benchmarking vs. goals
##### Step 15: Gather Feedback
**Feedback Channels:**
- Regular user surveys
- Focus groups
- One-on-one interviews
- Support ticket analysis
- Usage pattern analysis
**Questions to Ask:**
- What's working well?
- What's frustrating or confusing?
- What features are you not using and why?
- What capabilities are missing?
- How has the tool impacted your work?
**Feedback Loop:**
1. Collect feedback
2. Categorize and prioritize
3. Develop solutions
4. Implement improvements
5. Communicate changes
6. Return to step 1
##### Step 16: Optimize and Iterate
**Continuous Improvement Areas:**
**AI Model Tuning:**
- Retrain with new data
- Adjust parameters
- Add new features
- Improve accuracy
- Reduce bias
**Workflow Refinement:**
- Streamline processes
- Remove unnecessary steps
- Add missing capabilities
- Improve user experience
**Integration Enhancement:**
- Add new connections
- Improve data flow
- Reduce latency
- Increase reliability
**User Adoption:**
- Additional training
- Better documentation
- More use cases
- Success sharing
**Cost Optimization:**
- Right-size infrastructure
- Optimize API usage
- Reduce inefficiencies
- Negotiate better pricing
##### Step 17: Expand Capabilities
**Advanced Features:**
- Activate additional modules
- Implement complex workflows
- Add AI capabilities
- Expand integrations
**New Use Cases:**
- Apply to adjacent problems
- Expand to new departments
- Integrate with other tools
- Build on success
**Scale Operations:**
- Increase volume
- Geographic expansion
- Additional user groups
- Enterprise-wide deployment
### Real-World Implementation Examples
#### Example 1: Customer Service AI Implementation
**Company:** E-commerce retailer, 500K customers, 50 support agents
**Business Objective:**
Reduce support costs by 30% while maintaining 90%+ customer satisfaction
**Tool Selected:**
AI-powered customer service platform with chatbot and agent assist
**Implementation Timeline:**
- Weeks 1-4: Planning and data preparation
- Weeks 5-8: Training chatbot on historical tickets
- Weeks 9-12: Pilot with 20% of incoming tickets
- Weeks 13-20: Full rollout with gradual automation increase
**Results:**
- 65% of routine inquiries automated
- 45% reduction in average handling time
- Customer satisfaction improved from 87% to 92%
- ROI: 425% in first year
**Key Success Factors:**
- Comprehensive training data from 2 years of tickets
- Human-in-the-loop for quality assurance
- Continuous learning from agent corrections
- Clear escalation paths to humans
#### Example 2: Sales AI Tool Implementation
**Company:** B2B SaaS company, 5000 leads/month, 25 sales reps
**Business Objective:**
Increase conversion rate by 15% through better lead prioritization
**Tool Selected:**
Predictive lead scoring and engagement platform
**Implementation Timeline:**
- Weeks 1-3: Historical data analysis
- Weeks 4-6: Model training and validation
- Weeks 7-10: Pilot with 5 sales reps
- Weeks 11-16: Full team rollout
**Results:**
- 28% increase in conversion rate
- 40% reduction in time wasted on low-quality leads
- 2x increase in meetings with high-value prospects
- Sales cycle reduced by 18%
**Key Success Factors:**
- Strong executive sponsorship
- Sales team involved in defining scoring criteria
- Regular model updates based on outcomes
- Integration with existing CRM
#### Example 3: Marketing Automation AI
**Company:** Multi-brand consumer products company
**Business Objective:**
Increase email marketing ROI through personalization at scale
**Tool Selected:**
**Implementation Timeline:**
- Weeks 1-4: Customer data integration and segmentation
- Weeks 5-8: Campaign workflow design
- Weeks 9-12: Pilot campaigns to key segments
- Weeks 13-24: Expansion to all brands and channels
**Results:**
- 156% increase in email engagement
- 43% improvement in conversion rates
- 3x more personalized campaigns executed
- 35% reduction in campaign creation time
- Marketing team scaled campaigns 5x without headcount increase
**Key Success Factors:**
- Unified customer data from Brevo
- Multi-channel orchestration (email, SMS, WhatsApp)
- AI-powered send time optimization
- Dynamic content personalization
- Behavioral trigger automation
### Common Implementation Challenges
#### Challenge 1: Data Privacy and Compliance
**Issue:** AI tools process sensitive customer data requiring compliance with GDPR, CCPA, and other regulations.
**Solutions:**
- Data privacy impact assessment
- Anonymization where possible
- Clear consent mechanisms
- Data retention policies
- Regular compliance audits
- Choose vendors with strong compliance credentials
#### Challenge 2: Model Bias and Fairness
**Issue:** AI models can perpetuate or amplify biases present in training data.
**Solutions:**
- Diverse, representative training data
- Regular fairness audits
- Multiple evaluation metrics
- Human review of sensitive decisions
- Bias detection tools
- Transparent decision-making
#### Challenge 3: Integration with Legacy Systems
**Issue:** Older systems may lack APIs or modern integration capabilities.
**Solutions:**
- Robotic Process Automation (RPA) for screen scraping
- Database-level integration
- File-based data exchange
- Middleware/integration platforms
- Gradual legacy system modernization
#### Challenge 4: User Resistance
**Issue:** Employees fear job loss or don't trust AI recommendations.
**Solutions:**
- Transparent communication about AI's role
- Emphasize augmentation, not replacement
- Involve users in design and testing
- Provide comprehensive training
- Quick wins to build trust
- Human override capabilities
#### Challenge 5: Unclear ROI
**Issue:** Difficulty quantifying AI tool value.
**Solutions:**
- Define clear baseline metrics before implementation
- Track both quantitative and qualitative benefits
- Regular ROI reporting to stakeholders
- Case studies and success stories
- Long-term view (benefits compound over time)
### Best Practices for Sustainable AI Tool Management
#### 1. Governance Framework
**AI Committee:**
- Cross-functional leadership
- Regular meetings to review AI initiatives
- Approval process for new AI tools
- Performance review of existing tools
**Policies and Standards:**
- AI use case approval criteria
- Data privacy and security requirements
- Model validation standards
- Vendor evaluation framework
#### 2. Center of Excellence
**Purpose:**
- Build internal AI expertise
- Share best practices
- Provide consulting to business units
- Evaluate new AI capabilities
**Activities:**
- Training and certification programs
- Tool evaluation and selection
- Implementation methodology
- Knowledge repository
#### 3. Continuous Learning
**Model Maintenance:**
- Regular retraining with fresh data
- Performance monitoring and alerting
- A/B testing of model improvements
- Version control and rollback capabilities
**Team Development:**
- Ongoing training on AI advances
- Vendor training and certification
- Conference attendance
- Knowledge sharing sessions
#### 4. Vendor Relationship Management
**Regular Reviews:**
- Quarterly business reviews
- Roadmap alignment discussions
- Support quality assessment
- Pricing optimization
**Strategic Partnership:**
- Early access to new features
- Input on product direction
- Case study participation
- Reference opportunities
### Measuring Long-Term Success
**Year 1: Adoption and Baseline**
- Successful deployment
- User adoption achieved
- Baseline ROI positive
- Processes stabilized
**Year 2: Optimization and Expansion**
- Efficiency gains accelerating
- Additional use cases implemented
- Advanced features adopted
- ROI improving
**Year 3: Transformation**
- AI embedded in culture
- Significant competitive advantage
- New capabilities enabled
- Sustained high ROI
**Long-Term Indicators:**
- AI tool integral to operations
- Continuous innovation
- Quantifiable business impact
- Positive user sentiment
- Scalable, sustainable processes
### Conclusion
Successful AI tool implementation is a journey that requires careful planning, disciplined execution, and continuous optimization. The framework outlined in this guide provides a roadmap from initial evaluation through long-term value realization.
Key principles for success:
- Start with business problems, not technology
- Build a strong data foundation
- Invest in change management
- Pilot before full deployment
- Monitor and optimize continuously
- Maintain realistic expectations
Remember: AI tool implementation is not a one-time project but an ongoing program of continuous improvement. The organizations that succeed are those that build AI capabilities systematically, learn from experience, and remain committed to extracting maximum value from their AI investments.
Start with one high-impact use case, follow this framework, prove value, and scale from there. With the right approach, AI tools can transform your business operations and deliver sustainable competitive advantage.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is ai tool implementation?**
A comprehensive, step-by-step framework for successfully selecting, deploying, and optimizing AI tools in your organization, from initial evaluation through long-term management and ROI maximization.
**How do I get started with ai tool implementation?**
Start with the fundamentals: understand core concepts, choose the right tools, and implement step by step. This guide covers everything from beginner to advanced.
**What are the best tools for ai tool implementation?**
The best tools depend on your budget and needs. Brevo offers a comprehensive free tier covering email, SMS, CRM, and automation. See this guide for detailed recommendations.
---
## AI Tools ROI: A Practical Framework for Which Tools Actually Pay for Themselves
Source: https://tajo.io/blog/ai-tools-roi-calculator-which-tools-pay-for-themselves/
Published: 2025-01-15 · Updated: 2026-05-16
A practical framework for calculating AI tool ROI in 2026. Learn the total-cost-of-ownership formula, worked examples, payback periods, and a decision checklist for choosing tools that pay for themselves.
Summary: Calculate AI tool ROI with a simple formula: (value created minus total cost of ownership) divided by total cost. Value is hours saved times loaded hourly rate plus new revenue. Compare full annual cost, not the sticker price, and favor tools with a payback period under six months and high usage frequency.
Every AI tool promises to save you time or make you money. Far fewer prove it. With dozens of AI subscriptions now competing for the same monthly budget, the useful question is not "is this tool good" but "does this tool pay for itself, and how fast." This guide gives you a repeatable framework to answer that, with worked examples and a decision checklist you can apply to any tool, from a $20 writing assistant to a five-figure platform.
The numbers below are illustrative. Real ROI depends on your wages, volumes, and how consistently the tool gets used, so treat the examples as a model to copy rather than a benchmark to quote.
### The core ROI formula
At its simplest, return on investment for any tool is:
```
ROI (%) = (Value created - Total cost of ownership) / Total cost of ownership x 100
```
A tool that returns more value than it costs has positive ROI. To make that real, you need to define both sides of the equation honestly, which is where most quick estimates fall apart.
### Step 1: Calculate the full cost of ownership
The sticker price is rarely the real price. Total cost of ownership (TCO) for an AI tool usually includes:
- **Subscription or license fees** - the obvious monthly or annual line item
- **Usage or token fees** - many AI tools charge per call, per word, or per credit on top of the base plan, and this is where bills surprise people
- **Onboarding and setup** - the hours spent configuring, connecting data, and getting it production-ready
- **Training time** - what it costs to get your team fluent enough to actually benefit
- **Integration and maintenance** - connectors, API work, and ongoing upkeep
- **Human-in-the-loop cost** - the review and correction time the tool still requires
A $30 per month tool that needs 20 hours of setup and constant editing can easily cost more in year one than a $200 per month tool that works out of the box. Always compare annual TCO, not headline price.
### Step 2: Quantify the value created
Value comes from two sources. Most tools deliver one strongly and the other weakly.
**Time saved (cost avoidance).** This is the most reliable value to measure because it is concrete.
```
Time value = Hours saved per month x Loaded hourly cost x 12
```
Use the *loaded* hourly cost, not the raw wage. Loaded cost includes taxes, benefits, software, and overhead, typically 1.25 to 1.4 times the base wage. A team member on a $60,000 salary costs roughly $40 to $45 per loaded hour, not $29.
**Revenue created (or protected).** Harder to attribute, but often where the biggest wins hide. Examples: an AI tool that recovers abandoned carts, lifts email conversion, reduces churn, or shortens sales cycles. Attribute conservatively and only count revenue you can plausibly tie to the tool.
> A rule of thumb: if you cannot name the specific task the tool replaces or the specific revenue it influences, you are not ready to calculate its ROI yet.
### Step 3: Find the payback period
ROI tells you whether a tool wins. Payback period tells you how fast.
```
Payback period (months) = Total monthly cost / Monthly value created
```
For most small and mid-sized businesses, a payback under three to six months is excellent, under twelve months is acceptable for larger platform bets, and anything longer needs a strategic justification beyond pure efficiency.
Decision: How long until the tool pays back?
- If Under three to six months: Excellent (The benchmark for most small and mid-sized businesses.)
- If Under twelve months: Acceptable for a platform bet (Reasonable for larger platform investments, not point tools.)
- If Longer than twelve months: Needs a strategic case (Pure efficiency no longer justifies it.)
### Worked examples
#### Example 1: AI writing and email assistant ($25/month)
A marketer spends 8 hours a month drafting emails and copy. An AI assistant cuts that to 3 hours, saving 5 hours monthly.
- Loaded hourly cost: $42
- Monthly value: 5 hours x $42 = $210
- Monthly cost (including light review time): about $35
- **Net monthly value: roughly $175. Payback: well under one month. ROI: strongly positive.**
This is the classic "pays for itself" pattern: a cheap tool against a frequent, clearly valued task.
#### Example 2: Coding assistant for a 4-developer team ($20/user/month)
Each developer saves an estimated 4 hours a month on boilerplate and debugging.
- Loaded developer hourly cost: about $75
- Monthly value: 4 devs x 4 hours x $75 = $1,200
- Monthly cost: 4 x $20 = $80
- **Net monthly value: about $1,120. ROI is very high if the time savings are real and consistent.**
The risk here is not cost, it is whether the savings actually materialize or just feel good. Measure with a before-and-after on real tasks.
#### Example 3: Marketing automation platform ($150/month)
A platform that automates abandoned-cart recovery and re-engagement for an e-commerce store.
- Recovered revenue attributed to the flows: about $2,500/month
- Setup time amortized over year one: about $40/month
- Subscription: $150/month
- **Net monthly value: roughly $2,310. The revenue side dwarfs the time side, which is typical for marketing tools.**
This is where revenue, not just hours, drives the case. The cart-recovery flow runs whether or not anyone is at their desk.
### A decision framework: which tools pay for themselves
Run any AI tool through these five checks before you commit:
1. **Frequency.** Does it touch a task you do daily or weekly, not once a quarter? High frequency multiplies small per-use savings into real money.
2. **Measurable output.** Can you point to hours saved or revenue influenced? If the only benefit is "it feels faster," the ROI case is weak.
3. **Replacement clarity.** Does it replace a known cost (a freelancer, a manual process, another tool) rather than adding a new line item with vague benefits?
4. **Adoption likelihood.** Will the team actually use it? An unused $20 subscription has infinitely negative ROI.
5. **Payback under your threshold.** Set a rule, for example "must pay back within six months," and hold every tool to it.
Sequence, triggered by: AI tool under evaluation
1. Frequency
2. Measurable output
3. Replacement clarity
4. Adoption likelihood
5. Payback under your threshold
Outcome: Commit
| Tool profile | Typical value source | Pays for itself when |
|--------------|---------------------|----------------------|
| Writing / content assistant | Hours saved | Used weekly by anyone billing time |
| Coding assistant | Hours saved | Team uses it on real work daily |
| Customer support AI | Hours saved + deflection | Ticket volume is high |
| Marketing automation | Revenue created | Store has traffic and abandoned carts |
| Analytics / BI copilot | Hours saved + better decisions | Reporting is currently manual |
| Niche / single-use tools | Marginal | Rarely, watch for subscription creep |
### Common ways the math goes wrong
- **Counting savings that never happen.** "It could save 10 hours" is a hypothesis, not a result. Re-measure after 30 days.
- **Ignoring usage fees.** Token and credit overages can multiply the base price. Model your realistic volume.
- **Forgetting the human in the loop.** If every output needs review, count that time as a cost.
- **Subscription creep.** Five $20 tools is $1,200 a year. Audit your stack quarterly and cancel what nobody opens.
- **Over-attributing revenue.** If three things changed at once, do not credit all the lift to the new tool.
### The bottom line
A tool pays for itself when the value it creates clearly exceeds its full cost of ownership, and it earns a place in your stack when that payback happens fast and the team actually uses it. Run the simple formula, compare annual TCO rather than sticker price, favor high-frequency tasks and revenue-driving automation, and re-measure after the first month. Do that consistently and your AI budget stops being a guess and starts being a portfolio of investments you can defend.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**How do you calculate ROI on an AI tool?**
Use ROI = (value created minus total cost) divided by total cost, times 100. Value created is hours saved multiplied by loaded hourly cost, plus any new revenue the tool drives. Total cost is the full annual cost of ownership: subscription, usage fees, onboarding, training, and integration time. A tool that returns more than it costs has positive ROI; the payback period tells you how fast.
**Which AI tools pay for themselves the fastest?**
Tools that automate a frequent, measurable task with a clear hourly cost tend to pay back fastest. Examples include AI writing and email tools, customer support assistants, coding assistants for developers, and marketing automation that recovers abandoned carts. The common thread is high usage frequency times a clear time or revenue value per use.
**What is total cost of ownership for AI tools?**
Total cost of ownership (TCO) is the full annual cost beyond the sticker price: subscription or license fees, per-use or token-based usage charges, onboarding and setup, training time, integration and maintenance, and the cost of any human review the tool still needs. Comparing TCO rather than headline price prevents nasty surprises.
**What is a good payback period for an AI tool?**
For most small and mid-sized businesses, a payback period under three to six months is strong, and under twelve months is reasonable for a larger platform investment. Anything beyond a year deserves scrutiny unless the tool is strategic infrastructure rather than a point solution.
---
## Why a hundred nearly perfect steps still fail
Source: https://tajo.io/blog/almost-perfect-steps-unreliable-chain/
Published: 2026-10-08 · Updated: 2026-10-08
A 99% reliable step repeated a hundred times succeeds only 36.6% of the time under a simple model. Here is what that means for long agent workflows.
Summary: A 99% reliable action repeated a hundred times completes the entire chain only about 36.6% of the time if failures are independent. The figure is illustrative, but the design lesson is real: shorten the chain of decisions that need a model, define a verifiable end state, and measure completed transactions rather than successful intermediate calls. A shorter chain still needs checks at the boundary where work becomes real.
Consider an illustrative browser task with one hundred steps. Suppose each step succeeds 99% of the time, independently of the others. The chance that *every* step works is `0.99^100`, or about 36.6%.
Ninety-nine percent sounds excellent. Thirty-six percent does not.
The [source discussion of transactional browser work](https://www.youtube.com/watch?v=5xi_S1f9sDU&t=328s) uses this calculation to make a narrow point: the customer gets value when the task finishes, while cost and failure risk accumulate at every step. It is arithmetic under an assumption, not a published success rate for any browser agent or Tajo sync. Real errors can depend on one another. One expired login can break several later actions at once.
The useful question is therefore not “How accurate was the model's last click?” It is “Did the user's requested state appear?”
### The transaction is the unit that matters
Imagine an agent opening an insurance portal, finding a document, downloading it and confirming that it belongs to the correct account. It can navigate 99 screens correctly and still download the wrong file on screen 100. A call log full of successful clicks does not repair the result.
The same distinction applies to an integration. An agent can discover an API, propose a field mapping and save a draft. None of those actions means a destination contact now has the intended consent state. The work is complete only when the approved operation has run and its relevant postcondition has been checked.
This is a difference between *activity* and *completion*. Activity is easy to count. Completion needs a definition.
For a file download, the definition might be an artifact whose account number matches the request. For a contact sync, it might be a destination record with the correct identifier, fields and permitted messaging status. The check must inspect the thing the user cared about. A green response from the preceding call is evidence that a call returned. It may not be evidence that the destination changed as intended.
Tajo's [guide to connecting business tools](/blog/how-to-integrate-multiple-business-tools/) starts with the workflow and the source of truth for each data object. Those choices give the final check its meaning. If two systems both claim to own a field, even a perfectly executed write may produce the wrong long-term state.
### The cost of another decision
Under the same hypothetical 99% assumption, ten independent decisions yield about 90.4% full-chain success. Fifty yield about 60.5%. One hundred yield about 36.6%.
The curve is steep because multiplication has no sympathy for a good average. Each additional decision must earn its place.
That does not mean every API call should be collapsed into one giant operation. Some calls are deterministic: fetching a page with a known cursor, comparing an identifier, or writing a field according to an approved mapping. A model does not need to decide those again for every record. Other calls involve genuine ambiguity: a new vendor field, a changed error message, or a request whose owner is unclear. Those may need judgment.
The practical split is to let judgment design or repair a rule, then let ordinary code apply the stable rule. [Reverse ETL](/blog/what-is-reverse-etl/) is a useful example of repeated data movement: the pipeline, not a conversation, should perform each routine row operation. An agent can still help decide what the pipeline ought to do.
This is a boundary, not a slogan. If a vendor changes the meaning of a field, a deterministic rule can repeat the wrong action perfectly. The system needs a way to detect that its assumptions changed and return the case to review.
### Why one big tool is not the answer
A fair objection is: “If long chains fail, put the entire task behind one tool call.” That helps when the tool is a well-defined transaction with a checkable result. It fails when the tool merely hides a long, uncertain process.
Suppose `syncCustomer()` returns `success: true` after sending an update. If the destination processes updates later, the call cannot yet prove the final contact state. The tool reduced visible steps. It did not reduce uncertainty.
A better interface exposes the state that matters: accepted, applied, checked, or failed. Those words should correspond to evidence. An accepted write may be enough for a low-consequence preview. A campaign audience or consent change deserves a destination check before anyone calls it complete.
In this proposed Tajo view, an accepted request and an applied update are separate from a verified destination state. The final check remains pending. That distinction gives the next action a purpose: inspect what the destination stored. Counting one more successful tool call would leave the original question unanswered.
This also changes what to measure. Record the number of attempts if it helps diagnose cost. Record intermediate errors if they point to a broken step. But judge the workflow by verified completed transactions, with the verification method written beside the number. A team that reports “99% of calls succeeded” has not answered whether customers got their work done.
The [MCP server explainer](/blog/what-is-an-mcp-server/) shows how tools let an assistant call another system. Tool access is only the opening move. The contract is the state left behind.
A hundred good clicks can still leave nothing. Count the result.
### Frequently asked questions
**Why does a long workflow fail when its steps are usually correct?**
If each step succeeds independently with probability p, an n-step chain succeeds with probability p to the power n. At an assumed 99% per step, a hundred-step chain completes about 36.6% of the time. Actual failures may be correlated, so the calculation is an illustration rather than a measured agent rate.
**Does reducing the number of tool calls guarantee reliability?**
No. Fewer calls help only when the combined operation still exposes the right checks and recovery points. A single opaque call can hide a failed write as easily as a long chain can lose its place.
**What should a team measure for an agent workflow?**
Measure verified completion of the user's transaction, not only successful model calls. Define the artifact or destination state that proves the job finished, then record how often it appears after the whole workflow.
---
## What is each approval protecting?
Source: https://tajo.io/blog/approval-queues-and-the-cost-of-waiting/
Published: 2026-10-08 · Updated: 2026-10-08
Every approval can guard a real risk or add waiting. Map the decision path before removing or adding a gate.
Summary: An approval is valuable when it protects a named consequence. It is wasteful when it exists only because work crosses a team boundary. Map the wait, the decision owner and the risk at each gate. Let reversible tests proceed within bounds; keep enforced approval for customer data, permission changes and live external writes.
A recorded team described an experiment that could not proceed until fourteen people had been asked. The delay came before anyone had said no. The work sat in a queue of permissions to seek.
The [source clip](https://www.youtube.com/watch?v=c9ua3OBSR9A&t=12s) describes a rule that narrowed veto power while retaining management and legal or privacy checks. It is a report about one organization, not evidence that every company should copy its structure. The useful question for an integration team is simpler: what does each approval protect?
### Draw the actual decision path
Suppose an illustrative team wants to add a new customer attribute to a store-to-email sync. Product reviews the need. Engineering reviews the mapping. Security reviews the data scope. Marketing reviews the audience. An administrator approves the destination change.
Five gates may be justified. Five gates may also contain three copies of the same question. The count alone cannot tell you.
For each gate, write the decision it owns. “Does this field contain data the destination may receive?” is a distinct security and privacy question. “Will this audience include the right customers?” is a marketing question. “Does the mapping conform to the destination's type?” can often be checked in code. A meeting that merely asks whether another meeting approved it protects nothing new.
The [business-tool integration guide](/blog/how-to-integrate-multiple-business-tools/) asks which system owns each object and what event should trigger a transfer. Those are decision rights. Put them near the beginning of the path, where later reviewers can use them.
A queue map should include handoffs, not just approver names. A request might spend two days waiting for someone to identify the destination owner, then only minutes in actual review. If the owner can be determined from the account and data type, route it directly. If the decision depends on context, include that context in the request so the approver does not begin another round of questions. The shorter path comes from removing search and rework as well as duplicate vetoes.
### Put gates where consequences begin
The fair objection to fewer approvals is strong: “One wrong sync can move private customer data.” Yes. Removing the control at that boundary would be reckless. But an approval for a small, isolated mapping preview is not the same as approval to activate a broad live write.
Separate the reversible rehearsal from the consequential action. A draft can be inspected without changing a destination. A preview can be limited to known records. Activation affects real data and should require the authority appropriate to that effect. This creates a shorter path for learning and a firm path for commitment.
The boundary must be enforced by the system. A paragraph telling an agent to ask permission is not an approval gate if the same agent can call the live write anyway. The control needs to bind the exact action and account, and leave a record of who approved it.
That does not mean every approver must be a different team. The person with authority over the data may be the same person who understands the campaign. The point is to match authority to the consequence rather than to the organization chart.
Watch for gates that migrate rather than disappear. If a team removes a formal approval but engineers still wait for an informal message from the same group, the cycle has not changed. Record the first request time, the time a complete packet was available, the decision time and the action time. This separates delay caused by missing evidence from delay caused by authority. The remedy differs: better inputs for the first, clearer ownership for the second.
Sequence, triggered by: Proposed sync change
1. Check deterministic facts
2. Preview bounded records
3. Approve the consequence
Outcome: Live rule with an accountable owner
### Measure waiting and catches together
A tempting dashboard shows “approval time reduced by 60%.” Without evidence of what the old gates caught, it could celebrate a loss of protection. Record two things for each gate: time spent waiting and the class of problem it detects. If a gate never finds an issue, investigate whether it can be automated or removed. If it catches a rare but serious permission error, keep it and shorten its wait.
An illustrative audit may find that three reviews all check the field type, while none checks whether the source consent applies to the destination campaign. The solution is not merely fewer approvals. It is a better question at the decisive gate.
The [Brevo connector guide](/blog/brevo-connector-guide/) shows why a field can look mapped while the destination does not hold the intended value. A preflight type check can handle part of that problem. A person still owns the decision to use the resulting audience.
Approval is a cost. So is an unapproved mistake.
The test is whether the next request reaches a decision with enough evidence and the right authority. A gate that catches a real privacy issue earns its place, but it should receive the facts it needs without a week of routing. A gate that repeats a type check should become a test. Review the path again when the scope of the data or the destination changes. Name the risk each gate buys down, then keep only the gates that earn their wait.
### Frequently asked questions
**Should teams remove all approvals to move faster?**
No. Keep approvals tied to a specific risk or irreversible action, including legal, privacy and customer-data changes. Remove gates that merely repeat another team’s preference without owning a distinct consequence.
**How can an approval queue be measured?**
Record the time spent waiting at each gate, the issue each gate catches and the consequences of bypassing it in a safe test. Count decision quality as well as speed.
**What is an appropriate approval for a sync?**
A mapping preview may be reversible. Activating a rule that sends data to another system has different consequences. Put approval at the boundary where the consequence begins.
---
## Ask the source before copying the data
Source: https://tajo.io/blog/ask-the-source-before-copying-the-data/
Published: 2026-10-08 · Updated: 2026-10-08
A question may need a fresh read from the source, not a second database. Choose remote access or sync by what the next system must do.
Summary: When the job is to answer a question, read the authorized source and return the smallest useful result. Copy data when another system must own state, respond while the source is unavailable, or act on a durable event. A remote query still needs permissions, freshness limits, latency budgets and a clear failure state.
Imagine a support screen that needs one answer: has this order been paid? The payment system has the answer. An integration team proposes copying every payment record into a second database, keeping the copy current, and reading the copy when the agent opens the order. This is a hypothetical operational example, not the analytical use case in the cited demonstration.
That might be necessary. First ask whether the screen only needs one authorized answer now.
A [technical demonstration of cross-cloud analytical queries](https://www.youtube.com/watch?v=6uk0XHrfMs0&t=1304s) shows a query across existing data sources without first building a permanent copy of the source table in the destination. The same demo materializes a joined table, showing that remote access and copying can coexist within one workflow. This is a real product capability, not a promise that an analytical query service is suitable for an operational payment-status screen or that data never moves during execution. [Google Cloud’s federated-query documentation](https://docs.cloud.google.com/bigquery/docs/federated-queries-intro) explains that some external-query results temporarily move into the query service. The distinction that matters is between a permanent synchronized replica and a bounded read for a specific question.
### Decide from the consumer’s job
There are two different requests hidden inside “connect these systems.” One asks, “What does the source say now?” The other asks, “What state must the destination hold so it can act later?”
For the support screen, a scoped read can return an order status and its observation time. The source remains the authority. If the source is down, the screen should say the current status is unavailable or clearly label a cached answer. A second copy would create a new question: which status wins when the two disagree?
For an abandoned-cart campaign, the destination may need to act without someone opening a screen. It may need a timely event, a consent state and a way to cancel a queued message after purchase. A live read at campaign time might still help, but a mere answer on demand is not the whole job.
| Consumer needs | First design to test | Principal tradeoff |
| --- | --- | --- |
| One current answer | Scoped query to the owner | Depends on source access and latency |
| Continuous action on change | Event or minimal delta sync | Must handle delay, duplicates and missed events |
| Historical decision evidence | Versioned snapshot of the relevant fields | Must govern retention and access |
| Operation during source outage | Explicit cache or replica | Can be stale; needs an age rule |
This is a decision table, not a benchmark. No universal query-versus-copy threshold follows from it.
### A copy has a continuing cost
The first extraction is easy to underestimate because it ends. The copy keeps living. A new field appears, an identifier merges, a permission changes, or an old event arrives after a new one. Now the destination can hold an answer the source would reject.
The cost is not only storage. It is reconciliation: monitoring lag, replaying missed changes, deleting data when required, and explaining why a decision used yesterday’s value. Those tasks are justified when the destination needs independent state. They are sorting when the only deliverable is a current answer.
A query has costs too. It can place load on the source, expose fields to another principal, cross a network boundary and fail at the worst moment. Query planners may process more data than the visible result suggests. The [federation documentation](https://docs.cloud.google.com/bigquery/docs/federated-queries-intro) describes execution details worth checking before treating a remote query as zero movement.
The safe query has a narrow purpose and a narrow result. Name the field owner. Restrict the caller’s permission. Decide how old an answer may be, how long the query may wait and what the interface says on timeout. Keep the observation time with the answer.
### When a controlled copy earns its cost
“Local data gives us a predictable interface and fewer remote failures.” That is a serious argument. If the workflow has a hard latency requirement or must continue through a source outage, a controlled replica may be the right design.
The word *controlled* does the work. Define which fields are copied, how quickly they must update, what happens when updates stop, and when the consumer refuses to act on stale state. Test a late correction as well as the happy path. A fast stale answer can be worse than a visible unavailable one.
Start with the smallest consumer question. If a read solves it, keep the source in charge. If an action needs local state, copy only what that action can justify.
A small trial can settle the choice without building a general replication layer. Pick one question the consumer actually asks, record how fresh its answer must be, and run an authorized query against the source. Observe latency, source load and failure behavior with realistic access controls. Then try the narrowest copied state that would satisfy the same consumer. Compare not just response time but correction, deletion and outage behavior. The [integration planning guide](/blog/how-to-integrate-multiple-business-tools/) supplies the broader workflow context; this trial chooses where an answer should live. Neither path is automatically cheaper when the continuing maintenance is counted.
A connection is not measured by how many rows crossed it.
### Frequently asked questions
**When is a remote query better than a sync?**
Use one when a caller needs an answer from an authoritative source and can tolerate that source’s availability and latency. Keep access scoped and show when the answer was read.
**When must data be copied?**
Copy the minimum necessary state when another system must act without a live query, retain an auditable snapshot, or meet a latency or availability requirement the source cannot satisfy.
**Does querying in place mean data never moves?**
No. A federation service may transfer intermediate or result data to execute a query. Check the provider’s documented execution, retention and security behavior.
---
## Automated Email: Complete Guide to Email Automation in 2026
Source: https://tajo.io/blog/automated-email-guide/
Published: 2026-03-25 · Updated: 2026-05-17
Learn how to set up automated emails that nurture leads, recover carts, and boost sales. Covers workflows, triggers, examples, and the best automation tools.
Summary: Automated emails run 24/7, delivering the right message at the right time based on customer behavior. Start with welcome, cart recovery, and post-purchase automations for maximum ROI.
Automated emails are the backbone of modern email marketing. While you sleep, they welcome new subscribers, recover abandoned carts, nurture leads, and re-engage inactive customers, generating revenue around the clock.
This guide covers everything about email automation: how it works, essential workflows, setup instructions, and the best tools to get started.
### What Is Email Automation?
Email automation sends pre-written emails triggered by specific actions or conditions:
| Trigger | Automated Email | Purpose |
|---------|----------------|---------|
| New signup | [Welcome series](/blog/welcome-email-guide/) | Onboard and engage |
| Cart abandoned | [Recovery email](/blog/abandoned-cart-email-guide/) | Recover lost sales |
| Purchase made | [Post-purchase follow-up](/blog/post-purchase-email-guide/) | Build loyalty |
| Inactivity (60+ days) | [Re-engagement campaign](/blog/re-engagement-email-guide/) | Win back customers |
| Birthday | [Birthday email](/blog/birthday-email-marketing-guide/) | Personalized offers |
| Page visit | Browse abandonment | Remind and convert |
### Why Automated Emails Matter
- **320% more revenue** than non-automated promotional emails
- **70.5% higher open rates** than regular campaigns
- **Saves 6+ hours per week** on manual email tasks
- **Runs 24/7** without human intervention
- **Personalizes at scale**, right message, right time, right person
### Essential Automated Email Workflows
#### 1. Welcome Email Series
**Trigger:** New subscriber signup
**Timing:** Email 1 immediately, then every 2-3 days
**Emails:** 3-5 in the series
This is your most opened email series. Use it to:
- Deliver any promised lead magnet
- Introduce your brand story
- Highlight key products/services
- Build the relationship before selling
#### 2. Abandoned Cart Recovery
**Trigger:** Cart created but not purchased (1 hour delay)
**Timing:** 1 hour, 24 hours, 48-72 hours
**Emails:** 3 in the series
Cart recovery emails bring back 5-15% of abandoned carts. Sequence:
1. Gentle reminder with cart contents
2. Social proof + product benefits
3. Incentive (discount or free shipping)
Sequence, triggered by: Cart created, not purchased
1. Email 1: Gentle reminder
2. Email 2: Social proof
3. Email 3: Incentive
#### 3. Post-Purchase Follow-Up
**Trigger:** Order completed
**Timing:** Immediately, then at delivery, then 7-14 days after
**Emails:** 3-4 in the series
Turn one-time buyers into repeat customers:
1. Order confirmation + upsell
2. Shipping/delivery update
3. Review request
4. Cross-sell recommendations
#### 4. Re-Engagement Campaign
**Trigger:** No opens/clicks in 60-90 days
**Timing:** Day 1, Day 4, Day 7
**Emails:** 3 in the series
Win back inactive subscribers:
1. "We miss you" with value reminder
2. Exclusive offer/incentive
3. "Last chance" before list cleanup
Sequence, triggered by: No opens or clicks in 60-90 days
1. Email 1: We miss you
2. Email 2: Exclusive offer
3. Email 3: Last chance
Outcome: List cleanup
#### 5. Lead Nurture Drip
**Trigger:** Lead magnet download or form submission
**Timing:** Every 3-5 days
**Emails:** 5-7 in the series
Educate and build trust until ready to buy.
### Setting Up Email Automation
#### Step 1: Choose Your Platform
[Brevo's free plan](/blog/brevo-free-plan-guide/) includes automation for up to 2,000 contacts, perfect for getting started. For more advanced needs:
| Platform | Free Automation | Visual Builder | Max Workflows |
|----------|----------------|----------------|---------------|
| **Brevo** | ✓ (2,000 contacts) | ✓ | Unlimited |
| **Mailchimp** | ✗ (paid only) | ✓ | Limited on free |
| **ActiveCampaign** | ✗ | ✓ | Unlimited |
| **Klaviyo** | ✓ (250 contacts) | ✓ | Unlimited |
#### Step 2: Map Your Customer Journey
Identify key moments where automated emails add value. Start with the highest-impact workflows first.
#### Step 3: Create Your First Automation
1. Select trigger (e.g., "new subscriber")
2. Set timing (immediate or delayed)
3. Design email content
4. Add conditions (optional: filter by segment)
5. Activate and monitor
#### Step 4: Test and Optimize
- Monitor open rates, click rates, and conversions
- [A/B test](/blog/ab-testing-guide/) subject lines and content
- Adjust timing based on engagement data
- Add/remove emails based on performance
### Automation Best Practices
1. **Start simple**, One workflow at a time, master it, then expand
2. **Personalize**, Use name, purchase history, and [segments](/blog/email-segmentation-guide/)
3. **Set exit conditions**, Remove contacts who convert mid-sequence
4. **Monitor deliverability**, Automated doesn't mean "set and forget"
5. **Respect frequency**, Don't overlap multiple automations on one contact
6. **Track revenue attribution**, Know which automations drive sales
### Automated Email + Ecommerce
### Getting Started
1. [Request early access](/#early-access)
2. Create a welcome email automation
3. Add abandoned cart recovery (if ecommerce)
4. Set up post-purchase follow-ups
5. Monitor and optimize weekly
Automated emails are the highest-leverage marketing activity you can invest in. Every workflow you set up generates returns for months and years to come.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is an automated email?**
An automated email is a message sent automatically based on a trigger, like a new signup, abandoned cart, purchase, or time delay. Unlike manual campaigns, automated emails run 24/7 and deliver personalized messages at exactly the right moment.
**What automated emails should every business have?**
Every business should have: welcome email series, abandoned cart recovery (for ecommerce), post-purchase follow-up, re-engagement for inactive contacts, and birthday/anniversary emails. These cover the full customer lifecycle.
**How do I set up email automation?**
Choose a platform with automation (Brevo's free plan includes it), select a trigger (signup, purchase, date), design your email, set timing and conditions, and activate. Start with a simple welcome email and expand from there.
---
## The person who knows the exceptions should shape the automation
Source: https://tajo.io/blog/automation-begins-with-the-exceptions/
Published: 2026-10-08 · Updated: 2026-10-08
A workflow specification loses the cases that make work hard. Let the task expert define those cases while code enforces data and permission rules.
Summary: The person closest to a task knows the exceptions that a clean process diagram often omits. Let that person shape the automation's decisions and test cases, then have code enforce access, data contracts and consequential writes. Start with one observed workflow and a few recent exceptions. This can shorten the handoff between problem and implementation without turning a domain expert into the security boundary.
A written request says: “When an order is paid, update the contact.” In this illustrative workflow, that one line is missing the order that gets canceled after payment, the guest who later creates an account and the buyer who never granted marketing permission.
The operator knows these cases because they have handled them. A developer can implement the one-line rule perfectly and still create the wrong result.
An [ingested conversation about building workplace agents](https://www.youtube.com/watch?v=kDLji2s7LV4) argues that the people who understand a task should shape its automation. It also names the catch: those people still need the right data and permission to act. That tension is the useful part of the idea.
### The exception is where expertise lives
A normal-path diagram is easy to draw. Event arrives, field is mapped, record is updated. The expert's knowledge often appears when the diagram fails.
What if two contacts share an email? What if a shipment is split? What if the latest order event arrives before an older one? What if the destination accepts an update but the source has already changed?
The expert does not need to know the answer to every API question. They do need to say which business state should win. “A canceled order must not qualify a contact for the post-purchase message” is a business rule. How to enforce it across late events is an engineering problem.
Our [integration guide](/blog/how-to-integrate-multiple-business-tools/) tells readers to name a source of truth for each object. That choice should come from the people responsible for the records. Code can then check event freshness and destination state against it.
### Give the expert a way to show, not only tell
The objection is fair: “If users build their own automations, we will get dozens of unreviewed rules touching customer data.” That is a real risk. The answer is not to hide the task from them. It is to separate authorship from authority.
Let the expert mark a handful of actual records: this one should update, this one should wait, this one should be suppressed. Ask why. Keep the source version and expected outcome with each example. These are better specifications than a sentence about “handling exceptions.”
Then make the allowed action narrow. A proposed mapping can be edited and previewed without sending anything. A live write needs the right credentials, approved fields and an enforceable scope. A promotional action also needs a valid consent basis. Our [double opt-in guide](/blog/double-opt-in-guide/) covers one way that permission can be recorded for email marketing; an order alone does not supply it.
In Tajo's mapping tools, a template can be checked with synthetic data before a draft rule is created. The three fields below are straightforward. The expert's harder question is what the map leaves out: whose consent definition governs the next message? Passing this preview cannot answer that policy question.
| Expert supplies | System enforces |
| --- | --- |
| Which order state counts | Event freshness and state lookup |
| Which customer identity is intended | Stable identifiers and conflict handling |
| Which cases should wait | Queue, review state and timeout policy |
| What a correct result looks like | Destination read-back or other postcondition |
| Which communication purpose is allowed | Permission and suppression at execution |
The division is not a wall. Engineers must question an impossible or unsafe rule, and experts must inspect real results. It is a way to keep each decision with the person or system that can actually defend it.
### Start with the last ten real cases
An imagined perfect workflow is a weak test. Take a small set of recent cases from the actual process, with customer data handled under the team's access rules. Mark the normal ones and the exceptions. If the rules cannot explain the ten, the automation is not ready to decide the eleventh.
For a first sync, a synthetic test order can demonstrate the mechanics. Production authorization and a sample of real cases are separate steps. The [Brevo Shopify integration guide](/blog/brevo-shopify-integration/) recommends checking a test contact and order in the destination before activating campaigns.
There is a cost to this method. The expert must spend time making tacit rules explicit. Someone must review cases where experts disagree. The team may learn that the process is inconsistent today, which is uncomfortable.
Some exceptions cannot be resolved with a permanent rule on the first pass. A guest identity may lack enough evidence to merge, or a consent record may be ambiguous. The specification should say "hold for review" and name who can decide, rather than force a yes or no from incomplete data. Record the decision and its reason. Over time, that queue shows whether the same uncertainty deserves a clearer rule, a better source field or continued human judgment. The automation is doing useful work even when its correct output is a bounded pause.
That is also the point. An agent can make a consistent decision only after the team decides what consistency means. Otherwise it scales the fastest person's guess.
The shortest specification is often one real exception, explained all the way through.
### Frequently asked questions
**Should the task expert build an automation without an engineer?**
The task expert should define the normal path, exceptions and acceptable outcomes. Engineering still needs to enforce identity, permissions, data contracts, retries and tests wherever the workflow acts on customer systems.
**Why do workflow specifications miss important cases?**
A summary of the normal path often leaves out exceptions people resolve from experience. Review recent real cases with the task expert and make the handling rule explicit before automating.
**Where should the first automation start?**
Start with one recurring task, one source of truth, one clear result and a few observed exception cases. Let the expert approve the rule and verify the destination state before expanding scope.
---
## Autoresponder Software: The Complete Guide to Email Automation Tools in 2026
Source: https://tajo.io/blog/autoresponder-software/
Published: 2026-03-08 · Updated: 2026-05-17
Discover the best autoresponder software for automated email marketing. Compare top tools, learn setup strategies, and master email automation for your business.
Summary: An autoresponder sends pre-written messages off triggers, timing, or subscriber behavior, and the sequence matters more than the tool. Start with welcome, cart recovery, and post-purchase flows, then compare platforms on trigger granularity, ecommerce data access, and what the price does as the list grows.
Autoresponder software has transformed how businesses communicate with customers. Instead of manually sending individual emails, autoresponders automatically deliver pre-written messages based on triggers, timing, or subscriber actions. For businesses seeking to scale their email marketing while maintaining personal connections, understanding and implementing the right autoresponder software is essential.
This comprehensive guide covers everything you need to know about autoresponder software: what it is, how it works, the best tools available in 2026, and step-by-step setup instructions to get you started.
### What Is Autoresponder Software?
Autoresponder software is a type of email marketing tool that automatically sends pre-scheduled or trigger-based emails to subscribers. When someone joins your email list, makes a purchase, or takes a specific action, the autoresponder delivers the right message at the right time without manual intervention.
#### How Autoresponders Work
The basic mechanism follows this pattern:
1. **Trigger Event**: A subscriber performs an action (signs up, clicks a link, makes a purchase, abandons a cart)
2. **Condition Check**: The software evaluates if the subscriber meets criteria for the autoresponder sequence
3. **Message Delivery**: The appropriate email is sent immediately or after a specified delay
4. **Sequence Continuation**: Subsequent emails follow based on the defined schedule or subscriber behavior
#### Types of Autoresponders
**Time-Based Autoresponders**
These send emails based on elapsed time since the trigger event. Example: Day 1 welcome email, Day 3 tips email, Day 7 offer email.
**Behavior-Based Autoresponders**
These respond to specific subscriber actions. Example: Sending a follow-up when someone clicks a product link but does not purchase.
**Event-Based Autoresponders**
These trigger on specific occasions. Example: Birthday emails, anniversary messages, or subscription renewal reminders.
**Transactional Autoresponders**
These confirm actions and provide necessary information. Example: Order confirmations, shipping notifications, password reset emails.
### Why Your Business Needs Autoresponder Software
#### Immediate Response to Customer Actions
When someone signs up for your newsletter at 2 AM, they expect acknowledgment. Without autoresponders, that new subscriber might wait hours or days for a welcome email. By then, their interest has cooled. Autoresponders ensure every subscriber receives immediate engagement, regardless of when they sign up.
#### Consistent Customer Experience
Manual email processes lead to inconsistency. One customer might receive a welcome sequence while another gets forgotten. Autoresponders guarantee every contact receives the same quality experience, maintaining brand standards across all communications.
#### Scalability Without Proportional Effort
As your email list grows from 100 to 10,000 to 100,000 subscribers, your autoresponders scale automatically. The same sequences that engaged your first hundred subscribers work identically for your hundred-thousandth, without requiring additional staff or resources.
#### Revenue Generation While You Sleep
Well-crafted autoresponder sequences generate revenue around the clock. Abandoned cart emails recover lost sales. Welcome sequences convert subscribers to customers. Win-back campaigns re-engage lapsed buyers. All without ongoing manual effort.
#### Data-Driven Optimization
Autoresponder software provides detailed analytics on open rates, click rates, and conversion metrics. This data enables continuous improvement of your email sequences, maximizing their effectiveness over time.
### The 10 Best Autoresponder Software Tools in 2026
#### 1. Brevo (Formerly Sendinblue)
**Best for: Multi-channel automation and e-commerce integration**
Brevo stands out as a comprehensive marketing platform that combines email autoresponders with SMS, WhatsApp, and advanced automation capabilities. Its per-email pricing model makes it particularly cost-effective for businesses with large contact lists.
**Key Autoresponder Features:**
- Visual workflow builder for complex automation sequences
- Multi-channel autoresponders (email, SMS, WhatsApp)
- Transactional email handling built-in
- Advanced segmentation and personalization
- A/B testing within automation workflows
- Real-time behavioral triggers
**Pricing:** Free plan includes 300 emails/day with unlimited contacts. Paid plans start at $9/month for 5,000 emails.
**Why Brevo Excels:** Unlike competitors charging per contact, Brevo's per-email pricing means you never pay for inactive subscribers. Combined with multi-channel capabilities, it offers exceptional value for growing businesses.
This combination transforms Brevo into the most powerful e-commerce autoresponder solution available.
#### 2. Mailchimp
**Best for: Small businesses and beginners**
Mailchimp remains popular for its user-friendly interface and extensive template library. Its Customer Journeys feature provides visual automation building, though advanced features require higher-tier plans.
**Key Autoresponder Features:**
- Pre-built automation templates
- Customer journey builder
- Predictive sending optimization
- Content optimizer with AI assistance
- E-commerce integrations
**Pricing:** Free plan limited to 500 contacts. Paid plans start at $13/month.
**Limitations:** Contact-based pricing becomes expensive as lists grow. SMS limited to US only. No WhatsApp support. Automation features restricted on lower tiers.
#### 3. ActiveCampaign
**Best for: Advanced automation requirements**
ActiveCampaign offers some of the most sophisticated automation capabilities available, including conditional logic, lead scoring, and CRM integration within the same platform.
**Key Autoresponder Features:**
- Advanced conditional branching
- Predictive sending
- Site tracking and behavior automation
- Built-in CRM with sales automation
- Machine learning predictions
**Pricing:** Starts at $29/month for 1,000 contacts.
**Considerations:** Higher learning curve than simpler alternatives. Pricing increases significantly with contact count.
#### 4. ConvertKit
**Best for: Creators and content publishers**
ConvertKit focuses on bloggers, podcasters, YouTubers, and other content creators. Its autoresponder features emphasize simplicity while providing the essential tools creators need.
**Key Autoresponder Features:**
- Visual automation builder
- Tag-based subscriber organization
- Landing page builder included
- Creator-focused templates
- Simple sequence creation
**Pricing:** Free plan for up to 1,000 subscribers. Paid plans start at $15/month.
**Considerations:** Less suited for e-commerce. Limited design customization compared to competitors.
#### 5. GetResponse
**Best for: All-in-one marketing needs**
GetResponse combines autoresponders with webinar hosting, landing pages, and conversion funnels in a single platform.
**Key Autoresponder Features:**
- Autoresponder sequences with timing controls
- Marketing automation workflows
- Conversion funnels
- Webinar integration
- AI email generator
**Pricing:** Free plan limited to 500 contacts. Paid plans start at $19/month.
#### 6. AWeber
**Best for: Reliability and deliverability**
AWeber has been in the autoresponder business since 1998, building a reputation for excellent deliverability and straightforward functionality.
**Key Autoresponder Features:**
- Drag-and-drop email builder
- Behavioral automation triggers
- Pre-built campaigns and templates
- Smart designer using AI
- Excellent deliverability rates
**Pricing:** Free plan for up to 500 subscribers. Paid plans start at $14.99/month.
#### 7. Drip
**Best for: E-commerce automation**
Drip specializes in e-commerce email marketing with deep integrations for Shopify, WooCommerce, and other platforms.
**Key Autoresponder Features:**
- E-commerce-specific workflows
- Product recommendation automation
- Customer behavior tracking
- Revenue attribution
- Pre-built e-commerce sequences
**Pricing:** Starts at $39/month for 2,500 contacts.
#### 8. Klaviyo
**Best for: Data-driven e-commerce**
Klaviyo has become the go-to solution for many Shopify stores, offering sophisticated segmentation and automation based on customer data.
**Key Autoresponder Features:**
- Predictive analytics
- Dynamic product recommendations
- Advanced segmentation
- SMS automation
- Revenue tracking per flow
**Pricing:** Free for up to 250 contacts. Paid plans start at $20/month.
**Considerations:** Premium pricing compared to alternatives. Can become expensive for larger lists.
#### 9. Constant Contact
**Best for: Event marketing and nonprofits**
Constant Contact offers solid autoresponder functionality with unique features for event promotion and nonprofit organizations.
**Key Autoresponder Features:**
- Automated email sequences
- Event management tools
- Social media posting
- Survey and poll creation
- Nonprofit pricing discounts
**Pricing:** Starts at $12/month for basic email.
#### 10. MailerLite
**Best for: Budget-conscious businesses**
MailerLite provides generous features on its free plan and affordable paid options without sacrificing essential autoresponder functionality.
**Key Autoresponder Features:**
- Automation workflows
- Website and blog builder
- Landing pages included
- Digital product sales
- Simple, clean interface
**Pricing:** Free for up to 1,000 subscribers. Paid plans start at $10/month.
### Feature Comparison: Top Autoresponder Software
| Feature | Brevo | Mailchimp | ActiveCampaign | Klaviyo |
|---------|-------|-----------|----------------|---------|
| **Free Plan Contacts** | Unlimited | 500 | None | 250 |
| **Visual Workflow Builder** | Yes | Yes | Yes | Yes |
| **Multi-Channel** | Email, SMS, WhatsApp | Email, SMS (US) | Email, SMS | Email, SMS |
| **CRM Included** | Yes | Basic | Yes | Yes |
| **A/B Testing** | Yes | Yes | Yes | Yes |
| **Pricing Model** | Per-email | Per-contact | Per-contact | Per-contact |
| **Best For** | Growing e-commerce | Beginners | Complex automation | Shopify stores |
### Setting Up Your First Autoresponder Sequence: A Step-by-Step Guide
#### Step 1: Define Your Autoresponder Goals
Before touching any software, clarify what you want your autoresponder to achieve:
**Common Autoresponder Goals:**
- Welcome new subscribers and introduce your brand
- Nurture leads toward a purchase decision
- Onboard new customers and reduce support requests
- Recover abandoned shopping carts
- Re-engage inactive subscribers
- Deliver lead magnets and content upgrades
Document your specific goal, target audience, and desired outcome before proceeding.
#### Step 2: Map Your Email Sequence
Plan each email in your sequence before writing:
**Welcome Sequence Example:**
| Email | Timing | Purpose | Content Focus |
|-------|--------|---------|---------------|
| 1 | Immediate | Confirm signup | Welcome, deliver lead magnet, set expectations |
| 2 | Day 2 | Build relationship | Share your story, brand values |
| 3 | Day 4 | Provide value | Best content or helpful tips |
| 4 | Day 6 | Social proof | Customer testimonials, case studies |
| 5 | Day 8 | Soft pitch | Introduction to products/services |
#### Step 3: Write Your Email Content
Follow these principles for effective autoresponder emails:
**Subject Lines:**
- Keep under 50 characters for mobile compatibility
- Create curiosity without being misleading
- Personalize when possible
- Test different approaches
**Email Body:**
- Lead with value, not sales pitches
- Write conversationally, as if emailing one person
- Include one clear call-to-action per email
- Keep paragraphs short for readability
- Use formatting (bold, bullets) to aid scanning
**Personalization:**
- Use subscriber name when available
- Reference their signup source or interest
- Segment content based on behavior
- Customize recommendations
#### Step 4: Configure Your Autoresponder Software
Using Brevo as our example platform:
**Creating an Automation Workflow:**
1. Navigate to Automations in your Brevo dashboard
2. Select Create New Workflow
3. Choose your trigger (e.g., Contact joins a list)
4. Add your first email step
5. Configure the delay before the next email
6. Add subsequent emails with appropriate delays
7. Set exit conditions (purchase, unsubscribe, etc.)
8. Test the workflow with a test contact
9. Activate the automation
**Essential Configuration Settings:**
- Double opt-in confirmation (recommended for compliance)
- Unsubscribe handling
- Bounce management
- Timezone considerations for send timing
#### Step 5: Test Your Autoresponder Thoroughly
Before launching, verify everything works correctly:
**Testing Checklist:**
- Subscribe using a test email address
- Confirm all emails arrive as expected
- Check timing between emails
- Verify all links work correctly
- Test on multiple email clients (Gmail, Outlook, Apple Mail)
- Confirm mobile rendering
- Test personalization tags
- Verify unsubscribe functionality
#### Step 6: Launch and Monitor
After launching your autoresponder:
**Key Metrics to Track:**
- Open rate (benchmark: 20-30%)
- Click-through rate (benchmark: 2-5%)
- Conversion rate (varies by goal)
- Unsubscribe rate (should be under 0.5%)
- Reply rate (indicates engagement)
**Optimization Actions:**
- A/B test subject lines
- Adjust send timing based on open data
- Revise underperforming emails
- Add or remove emails based on engagement patterns
### Advanced Autoresponder Strategies
#### Behavioral Branching
Move beyond linear sequences by creating branches based on subscriber behavior:
**Example Branching Logic:**
- If subscriber clicks product link: Send product-focused follow-up
- If subscriber does not open Email 2: Resend with different subject
- If subscriber purchases: Move to customer onboarding sequence
- If subscriber clicks pricing: Send case study and offer demo
#### Lead Scoring Integration
Assign points based on engagement and use scores to trigger autoresponders:
**Sample Scoring Model:**
- Email open: +1 point
- Link click: +5 points
- Product page visit: +10 points
- Pricing page visit: +20 points
- Cart creation: +30 points
**Score-Based Triggers:**
- Score reaches 50: Trigger sales sequence
- Score drops below 10: Trigger re-engagement sequence
#### Multi-Channel Autoresponders
Combine email with other channels for maximum impact:
**Abandoned Cart Multi-Channel Sequence:**
1. Hour 1: Email reminder with cart contents
2. Hour 4: SMS reminder (if opted in)
3. Day 1: Email with social proof
4. Day 2: WhatsApp message with support offer
5. Day 3: Final email with incentive
Sequence, triggered by: Cart abandoned
1. Email reminder
2. SMS reminder
3. Email with social proof
4. WhatsApp message
5. Final email
Brevo excels here with native support for email, SMS, and WhatsApp in unified workflows.
#### Dynamic Content Personalization
Customize email content based on subscriber data:
**Dynamic Elements:**
- Product recommendations based on browse history
- Content suggestions based on past engagement
- Offers tailored to purchase history
- Location-based messaging
- Industry-specific case studies
#### Sunset Policies for Inactive Subscribers
Maintain list health with automated cleanup:
**Sunset Sequence:**
1. Day 60 inactive: Send re-engagement email
2. Day 75 inactive: Send what have you missed email
3. Day 90 inactive: Final engagement attempt with special offer
4. Day 105 inactive: Unsubscribe warning with one-click retention
5. Day 120 inactive: Remove from active list
Sequence, triggered by: Subscriber goes inactive
1. Re-engagement email
2. What you have missed
3. Final attempt with a special offer
4. Unsubscribe warning
Outcome: Day 120: remove from the active list
### Autoresponder Best Practices
#### Deliverability Optimization
Ensure your autoresponder emails reach the inbox:
**Technical Requirements:**
- Authenticate your domain (SPF, DKIM, DMARC)
- Use a reputable sending platform
- Maintain consistent sending patterns
- Monitor blacklists and sender reputation
**Content Practices:**
- Avoid spam trigger words
- Balance image-to-text ratio
- Include plain text version
- Use recognizable sender name
#### Mobile Optimization
Over 60% of emails are opened on mobile devices:
**Mobile-Friendly Practices:**
- Single-column layouts
- Large, tappable buttons (minimum 44x44 pixels)
- Font sizes of 14px or larger
- Concise subject lines
- Preview text optimization
#### Compliance Requirements
Meet legal obligations for email marketing:
**Key Regulations:**
- **CAN-SPAM (US):** Require unsubscribe option, physical address, honest subject lines
- **GDPR (EU):** Explicit consent required, right to access and deletion
- **CASL (Canada):** Express consent required for commercial messages
**Implementation:**
- Use double opt-in when possible
- Maintain clear consent records
- Provide easy unsubscribe mechanism
- Honor requests promptly (within 10 business days maximum)
#### Content Calendar Integration
Coordinate autoresponders with your broader marketing:
**Avoid Conflicts:**
- Do not send autoresponder emails on major campaign days
- Pause sequences during holidays or company events
- Align messaging across all channels
- Coordinate with promotional calendars
### Integrating Autoresponders with E-commerce
#### Shopify Integration Options
For Shopify stores, deep integration between your autoresponder and store data is essential:
This combination enables sophisticated automation:
#### Customer Data Synchronization
Your autoresponder needs accurate customer data:
**Essential Data Points:**
- Purchase history
- Browse behavior
- Loyalty program status
- Customer lifetime value
- Segment membership
- Communication preferences
#### Revenue Attribution
Track which autoresponders generate revenue:
**Attribution Setup:**
- Enable revenue tracking in your autoresponder platform
- Set appropriate attribution windows (7-day, 30-day)
- Track both email-attributed and influenced revenue
- Compare performance across sequences
### Measuring Autoresponder Success
#### Key Performance Indicators
**Engagement Metrics:**
- Open rate by sequence and individual email
- Click-through rate
- Reply rate
- Forward and share rate
- List growth rate
**Revenue Metrics:**
- Revenue per email sent
- Revenue per subscriber
- Conversion rate by sequence
- Average order value from email
- Customer lifetime value impact
**Health Metrics:**
- Unsubscribe rate
- Complaint (spam report) rate
- Bounce rate (hard and soft)
- List churn rate
#### Benchmarking Your Results
Compare your results against industry standards:
| Metric | Average | Good | Excellent |
|--------|---------|------|-----------|
| Open Rate | 20% | 25% | 30%+ |
| Click Rate | 2.5% | 4% | 6%+ |
| Conversion Rate | 1% | 2% | 3%+ |
| Unsubscribe Rate | 0.3% | 0.2% | 0.1% |
| Bounce Rate | 2% | 1% | 0.5% |
#### Continuous Improvement Process
**Monthly Review Checklist:**
- Analyze performance of each active sequence
- Identify underperforming emails
- Test new subject lines and content
- Review segment performance
- Update outdated content
- Check for technical issues
**Quarterly Optimization:**
- Review full customer journey
- Assess sequence length effectiveness
- Test new automation triggers
- Evaluate tool performance
- Consider platform changes if needed
### Conclusion
Autoresponder software is no longer optional for businesses serious about email marketing. The ability to automatically engage subscribers at the right moment with the right message drives conversions, builds relationships, and generates revenue around the clock.
When selecting autoresponder software, consider your specific needs:
- **For multi-channel automation and value:** Brevo offers email, SMS, and WhatsApp capabilities with cost-effective per-email pricing
- **For beginners:** Mailchimp offers the gentlest learning curve
- **For complex automation:** ActiveCampaign provides the most sophisticated workflow capabilities
Decision: What do you need from an autoresponder?
- If First autoresponder, gentle start: Mailchimp (The gentlest learning curve.)
- If Complex branching and lead scoring: ActiveCampaign (The most sophisticated workflows, with a built-in CRM.)
- If Creator or publisher: ConvertKit (Tag-based sequences, free up to 1,000 subscribers.)
- If Tight budget: MailerLite (Free up to 1,000 subscribers, paid from $10 a month.)
The key is to start. Your first autoresponder sequence does not need to be perfect. Launch a basic welcome sequence, learn from the data, and iterate. Over time, your autoresponders will become sophisticated revenue-generating assets.
Ready to implement powerful autoresponders for your e-commerce store?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is autoresponder?**
Discover the best autoresponder software for automated email marketing. Compare top tools, learn setup strategies, and master email automation for your business.
**How do I get started with autoresponder?**
Start with the fundamentals: understand core concepts, choose the right tools, and implement step by step. This guide covers everything from beginner to advanced.
**What are the best tools for autoresponder?**
The best tools depend on your budget and needs. Brevo offers a comprehensive free tier covering email, SMS, CRM, and automation. See this guide for detailed recommendations.
**What is the difference between autoresponders and email automation?**
Autoresponders traditionally refer to simple time-based email sequences triggered by a subscription. Email automation is a broader term encompassing any automated email workflow, including behavioral triggers, conditional logic, and complex branching. Modern autoresponder software typically includes full automation capabilities, making the terms largely interchangeable today.
**How many emails should be in an autoresponder sequence?**
There is no single correct answer, but here are guidelines by sequence type: - **Welcome sequence:** 3-5 emails over 1-2 weeks - **Abandoned cart:** 3-4 emails over 3-5 days - **Onboarding:** 5-7 emails over 2-4 weeks - **Nurture/educational:** 6-12 emails over 4-8 weeks - **Win-back:** 3-4 emails over 2-4 weeks Monitor engagement metrics and adjust sequence length based on when subscribers stop engaging.
**How often should autoresponder emails be sent?**
Frequency depends on your audience and content: - **Aggressive (e-commerce):** Daily or every other day - **Standard:** 2-3 times per week - **Conservative (B2B):** Weekly - **Long nurture:** Bi-weekly Test different frequencies and monitor unsubscribe rates to find your optimal cadence.
**Can I use autoresponders without a website?**
Yes. You can collect email addresses through: - Social media links to landing pages - In-person collection (events, retail) - Partner promotions - Lead generation ads - QR codes Most autoresponder platforms include landing page builders, eliminating the need for a separate website.
**How do I improve autoresponder open rates?**
**Subject Line Optimization:** - Keep under 50 characters - Create curiosity - Use personalization (name, company) - Avoid spam triggers - A/B test consistently **Sender Optimization:** - Use recognizable sender name - Maintain consistent from address - Build sender reputation over time **Timing Optimization:** - Test different send times - Consider subscriber timezone - Use send-time optimization features
**What happens when someone unsubscribes from an autoresponder?**
When properly configured: 1. Subscriber is immediately removed from the active sequence 2. No further autoresponder emails are sent 3. They remain unsubscribed until they re-opt-in 4. Transactional emails (order confirmations) may still be sent 5. Compliance records are maintained
**Should I use plain text or HTML emails for autoresponders?**
Both have merits: **HTML Emails:** - Better for product showcases - Enables branding and design - Supports images and buttons - Higher visual impact **Plain Text Emails:** - Feel more personal - Better deliverability sometimes - Load faster - No rendering issues Many successful businesses use HTML for promotional content and plain text for relationship-building sequences. Test both approaches with your audience.
**How do I handle different time zones in autoresponders?**
**Options:** 1. **Send by recipient timezone:** Most modern platforms support this 2. **Universal send time:** Find the best single time for your audience 3. **Optimal send time algorithms:** Let AI determine the best time per subscriber Brevo and other advanced platforms offer timezone-aware sending and predictive send-time optimization.
**Can autoresponders work with SMS and other channels?**
Yes. Multi-channel autoresponders combine: - Email messages - SMS texts - WhatsApp messages - Push notifications - In-app messages Brevo excels here with native multi-channel automation. A single workflow can send email, wait for response, send SMS follow-up if no email engagement, and escalate to WhatsApp for high-value opportunities.
**How do I measure autoresponder ROI?**
**Calculate ROI:** 1. Track revenue attributed to autoresponder sequences 2. Subtract software costs 3. Subtract content creation time costs 4. Divide net profit by total cost **Example:** - Monthly autoresponder revenue: $10,000 - Software cost: $100/month - Time investment: $400/month (estimate) - Net profit: $9,500 - ROI: $9,500 / $500 = 1,900% Autoresponders typically generate exceptional ROI once established, as the primary investment is upfront creation with minimal ongoing costs.
---
## AWeber Alternatives: Email Automation, Creator Tools, Pricing Models, and Migration Fit (2026)
Source: https://tajo.io/blog/aweber-alternatives/
Published: 2026-03-08 · Updated: 2026-05-21
Compare AWeber alternatives by email automation, newsletter workflow, ecommerce fit, pricing model, free-plan limits, migration effort, and multichannel support.
Summary: AWeber remains reliable for email newsletters and autoresponders, but teams compare alternatives when they need stronger automation, cleaner pricing at scale, ecommerce data, CRM, creator monetization, or SMS and WhatsApp in the same stack.
AWeber has been a staple of email marketing since 1998, and it still does the core job well: newsletters, autoresponders, landing pages, and list management. The question in 2026 is not whether AWeber works. It is whether it still matches your growth model.
Teams usually start comparing AWeber alternatives for four reasons: contact-based pricing, lighter automation than newer workflow builders, limited native multichannel coverage, and ecommerce or CRM requirements that are easier to handle in a different stack. Pricing changes frequently, so this guide focuses on pricing models and decision points instead of treating any exact monthly number as permanent.
This guide compares the strongest AWeber alternatives for 2026.
### Why Users Are Switching from AWeber
Before exploring alternatives, understanding AWeber's current limitations helps clarify what to look for in a replacement:
#### Pricing Issues
- **Subscriber-based billing.** Contact tiers can make list hygiene a direct cost issue.
- **Feature gates.** Automation, landing pages, analytics, and support levels vary by plan.
- **Free-plan limits.** Free or starter tiers are useful for testing, but production send volume can force an upgrade quickly.
- **Add-on economics.** If you need SMS, WhatsApp, CRM, ecommerce automation, or loyalty, the total stack can cost more than the email plan.
#### Feature Limitations
- **Automation depth.** Newer workflow builders offer richer branching, lead scoring, and behavior triggers.
- **Ecommerce data.** Shopify and ecommerce teams often need product, order, customer, and revenue data inside segments.
- **CRM alignment.** B2B teams may need deal pipelines, lead scoring, and sales handoff logic.
- **Modern editor expectations.** Teams expect faster templates, reusable blocks, and easier testing.
- **Limited SMS/WhatsApp.** Multichannel campaigns usually require another tool.
#### E-commerce Gaps
- **Purchase-triggered flows.** Cart, browse, post-purchase, replenishment, and win-back flows need clean store events.
- **Loyalty programs.** Email alone does not cover rewards, tiers, and lifecycle incentives.
- **Revenue attribution.** Ecommerce teams need reporting tied to orders, not just opens and clicks.
### Quick Comparison: AWeber Alternatives
| Platform | Best fit | Pricing model to verify | Why compare it with AWeber |
|----------|----------|-------------------------|----------------------------|
| Mailchimp | Familiar newsletter workflows | Contact tiers and send limits | Broad template ecosystem and beginner-friendly editor |
| ActiveCampaign | Advanced automation | Contact tiers | Deeper branching, CRM, and lead scoring |
| GetResponse | Webinars plus email | Contact tiers | Native webinar and funnel features |
| MailerLite | Simple, low-friction email | Subscriber tiers | Clean editor and straightforward automations |
| Klaviyo | Ecommerce data | Profile and message tiers | Store-data segmentation and revenue attribution |
| Omnisend | Ecommerce omnichannel | Contact tiers plus message credits | Prebuilt commerce workflows |
| Constant Contact | Local and small business | Contact tiers | Support, events, and simple campaigns |
| Kit | Creators and newsletters | Subscriber tiers | Creator monetization and audience products |
| Campaign Monitor | Design-led campaigns | Contact and send tiers | Polished email design workflow |
| Moosend | Budget automation | Subscriber tiers | Lower-cost automation entry |
| Drip | Ecommerce lifecycle CRM | Contact tiers | Purchase-driven lifecycle automation |
### 2. Mailchimp
**Best for:** Beginners, small businesses starting with email marketing
Mailchimp remains one of the most recognized email marketing platforms, known for its user-friendly interface and extensive template library. It offers a gentler learning curve than AWeber while providing more modern features.
#### Key Features
- **Intuitive drag-and-drop editor** - Easy email creation
- **Creative Assistant AI** - Automated design suggestions
- **Website builder** - Included landing pages and website
- **Social media posting** - Built-in social management
- **Customer journey builder** - Visual automation workflows
- **Large template library** - Pre-designed email templates
#### Pricing model
Mailchimp uses contact-based tiers with monthly send limits and feature differences by plan. Before choosing it as an AWeber replacement, verify how unsubscribed contacts are counted, what the current free tier includes, and when customer journey automation or advanced testing requires an upgrade.
#### Pros
- Most user-friendly interface
- Excellent template library
- Built-in website builder
- Strong brand recognition
- Good deliverability rates
#### Cons
- Contact-based pricing gets expensive
- SMS only available in US
- No WhatsApp integration
- Limited automation on lower tiers
- Counts unsubscribed contacts toward billing
**Why choose Mailchimp over AWeber:** More modern interface, better template library, included website builder, and easier learning curve for beginners.
### 3. ActiveCampaign
**Best for:** Businesses needing advanced automation and CRM capabilities
ActiveCampaign delivers enterprise-level marketing automation with sophisticated customer journey mapping. It excels at complex workflows and provides built-in CRM functionality that AWeber lacks entirely.
#### Key Features
- **Advanced automation builder** - Industry-leading workflow capabilities
- **Built-in CRM** - Sales and marketing in one platform
- **Predictive sending** - AI-optimized send times
- **Site tracking** - Behavioral data collection
- **Lead scoring** - Automated prospect qualification
- **Conditional content** - Dynamic email personalization
#### Pricing model
ActiveCampaign uses contact-based pricing with plan gates for CRM, automation, reporting, and advanced features. Model the cost at your expected contact count after list cleanup, not just the entry tier.
#### Pros
- Most powerful automation in the market
- Built-in CRM functionality
- Excellent segmentation options
- Predictive analytics
- Strong deliverability
#### Cons
- Steeper learning curve
- Higher price point
- Can be overwhelming for beginners
- No free plan available
**Why choose ActiveCampaign over AWeber:** Significantly more powerful automation, built-in CRM, predictive analytics, and sophisticated customer journey mapping that AWeber cannot match.
### 4. GetResponse
**Best for:** Businesses combining email marketing with webinars and educational content
GetResponse uniquely combines email marketing with webinar functionality, making it ideal for businesses that use educational content and live events to nurture leads. This combination is something neither AWeber nor most competitors offer natively.
#### Key Features
- **Built-in webinar platform** - Host webinars without external tools
- **Conversion funnels** - Pre-built sales funnel templates
- **Marketing automation** - Visual workflow builder
- **Landing page builder** - No-code page creation
- **AI email generator** - GPT-powered content creation
- **Website builder** - Full website creation tools
#### Pricing model
GetResponse pricing depends on contact count and feature tier. The important question is whether you need webinars, funnels, and deeper automation, because those capabilities can sit above the basic email tier.
#### Pros
- Integrated webinar functionality
- Pre-built conversion funnels
- AI content generation
- All-in-one marketing platform
- Competitive pricing
#### Cons
- Automation requires higher tier
- Webinars limited on lower plans
- Interface can feel cluttered
- Some features require add-ons
**Why choose GetResponse over AWeber:** Built-in webinar functionality, conversion funnels, AI content generation, and more comprehensive marketing automation at similar pricing.
### 5. MailerLite
**Best for:** Budget-conscious businesses and beginners seeking simplicity
MailerLite offers an excellent balance of simplicity and capability at one of the most affordable price points in the market. It provides a generous free plan and straightforward pricing that contrasts sharply with AWeber's recent price increases.
#### Key Features
- **Clean, intuitive interface** - Easy to learn and use
- **Drag-and-drop editor** - Visual email builder
- **Website builder** - Included on all plans
- **Landing pages** - Unlimited on paid plans
- **Automation** - Visual workflow builder
- **Pop-ups and forms** - Built-in lead capture
#### Pricing model
MailerLite uses subscriber-based tiers with feature and send-volume differences by plan. It is often cost-effective for simple newsletters, but teams should verify current free-plan limits and the point where automation or support needs require a paid tier.
#### Pros
- Excellent free plan
- Most affordable paid plans
- Clean, simple interface
- Good deliverability
- 24/7 customer support
#### Cons
- Limited advanced features
- Fewer integrations than competitors
- Basic reporting
- No built-in CRM
**Why choose MailerLite over AWeber:** Simpler interface, clean design tools, straightforward automations, and a lower-complexity setup for teams that do not need CRM or multichannel messaging.
### 6. Klaviyo
**Best for:** Data-driven e-commerce brands focused on revenue attribution
Klaviyo is purpose-built for e-commerce, offering deep integration with platforms like Shopify, WooCommerce, and BigCommerce. Its data-first approach provides insights that AWeber simply cannot match for online stores.
#### Key Features
- **E-commerce data integration** - Deep store connections
- **Predictive analytics** - Customer behavior forecasting
- **Revenue attribution** - Track email revenue impact
- **Product recommendations** - AI-powered suggestions
- **Customer profiles** - Unified purchase history
- **SMS marketing** - Built-in text messaging
#### Pricing model
Klaviyo pricing is tied to profiles and message volume, with email and SMS modeled separately. It can be a strong fit when ecommerce revenue attribution justifies the cost, but it should be forecast at your active profile count after suppressions.
#### Pros
- Best-in-class e-commerce integration
- Powerful predictive analytics
- Detailed revenue attribution
- Built-in SMS capabilities
- Excellent segmentation
#### Cons
- Expensive at scale
- Primarily e-commerce focused
- Steep learning curve
- Pricing increases quickly with list size
**Why choose Klaviyo over AWeber:** Purpose-built e-commerce features, predictive analytics, revenue attribution, and significantly deeper integration with online stores.
### 7. Omnisend
**Best for:** E-commerce brands wanting omnichannel marketing
Omnisend specializes in omnichannel e-commerce marketing, combining email, SMS, push notifications, and more in one platform. Its pre-built automation workflows are specifically designed for online stores.
#### Key Features
- **Omnichannel campaigns** - Email, SMS, push in one flow
- **E-commerce automations** - Pre-built Shopify workflows
- **Product picker** - Easy catalog integration
- **Discount codes** - Automated unique code generation
- **Segmentation** - E-commerce-focused filters
- **Forms and pop-ups** - Built-in lead capture
#### Pricing model
Omnisend uses ecommerce-focused tiers with email volume, contact count, and SMS credits to verify. It is worth modeling around your store's real lifecycle flow volume, especially cart, browse, post-purchase, and win-back campaigns.
#### Pros
- E-commerce-first design
- Pre-built automation templates
- Easy omnichannel campaigns
- Good Shopify integration
- Affordable entry pricing
#### Cons
- Limited non-e-commerce features
- SMS credits cost extra
- Smaller template library
- Basic CRM capabilities
**Why choose Omnisend over AWeber:** Built specifically for e-commerce, omnichannel capabilities, pre-built automation workflows, and native cart abandonment features.
### 8. Constant Contact
**Best for:** Small businesses seeking reliability and customer support
Constant Contact has been in email marketing since 1995 and is known for excellent customer support and reliability. It offers a straightforward approach that many small businesses appreciate over AWeber's complexity.
#### Key Features
- **Event marketing** - Built-in event management
- **Social media tools** - Integrated posting and ads
- **Survey builder** - Customer feedback collection
- **List growth tools** - Forms, landing pages, integrations
- **Marketing automation** - Visual workflow builder
- **Reporting** - Engagement analytics
#### Pricing
| Plan | Price | Features |
|------|-------|----------|
| Lite | $12/mo | Basic features |
| Standard | $35/mo | Automation, scheduling |
| Premium | $80/mo | Advanced automation, SEO |
#### Pros
- Excellent customer support
- High deliverability rates
- Event marketing tools
- Easy to use
- Reliable platform
#### Cons
- No free plan (trial only)
- Limited automation compared to competitors
- Pricing increases quickly
- Dated template designs
**Why choose Constant Contact over AWeber:** Better customer support reputation, event marketing tools, simpler interface, and more reliable platform stability.
### 9. Kit (formerly ConvertKit)
**Best for:** Content creators, bloggers, and newsletter operators
Kit (formerly ConvertKit) is designed specifically for creators who build audiences through content. Its subscriber-centric approach and creator monetization features set it apart from AWeber's generic approach.
#### Key Features
- **Subscriber-first design** - Tag-based organization
- **Creator monetization** - Paid newsletters, tips
- **Landing pages** - Clean, conversion-focused
- **Visual automations** - Easy workflow builder
- **Forms** - Embeddable sign-up forms
- **Integrations** - Creator tool ecosystem
#### Pricing model
Kit pricing depends on subscriber count and creator feature tier. Check the current limits for free newsletters, automations, paid products, and advanced reporting before moving a creator audience.
#### Pros
- Purpose-built for creators
- Tag-based subscriber management
- Creator monetization options
- Clean, modern interface
- Strong creator community
#### Cons
- Limited for non-creators
- Basic e-commerce features
- Pricing increased significantly
- Limited template options
**Why choose Kit over AWeber:** Creator-focused features, built-in monetization, tag-based subscriber management, and cleaner interface designed for content creators.
### 10. Campaign Monitor
**Best for:** Design-focused teams and agencies
Campaign Monitor emphasizes beautiful email design with an intuitive drag-and-drop builder. It appeals to brands that prioritize visual appeal and agencies managing multiple clients.
#### Key Features
- **Award-winning designer** - Professional email builder
- **Template library** - Beautifully designed templates
- **Link review** - Catch broken links before sending
- **Personalization** - Dynamic content blocks
- **Automation journeys** - Visual workflow builder
- **Analytics** - Detailed engagement reporting
#### Pricing model
Campaign Monitor pricing varies by contact count, send volume, and feature tier. Verify current send limits, automation access, agency needs, and support level before choosing it for design-led campaigns.
#### Pros
- Best-in-class email designer
- Beautiful template library
- Excellent for agencies
- Strong link checking
- Professional results
#### Cons
- No free plan
- Limited automation compared to leaders
- Higher pricing for features
- Basic segmentation
**Why choose Campaign Monitor over AWeber:** Superior email design tools, better template library, cleaner interface, and more professional-looking results.
### 11. Moosend
**Best for:** Budget-conscious businesses seeking advanced features
Moosend offers an impressive feature set at one of the lowest price points in the market. It includes automation, landing pages, and AI tools at prices that significantly undercut AWeber.
#### Key Features
- **Marketing automation** - Visual workflow builder
- **Landing pages** - Built-in page builder
- **AI product recommendations** - E-commerce optimization
- **Weather-based targeting** - Conditional content
- **Countdown timers** - Urgency elements
- **Reporting** - Detailed analytics
#### Pricing model
Moosend pricing is subscriber-based, with a trial or entry path that changes over time. Check current automation, landing page, and ecommerce feature access before treating it as the lowest-cost AWeber replacement.
#### Pros
- Extremely affordable
- Full automation on all plans
- AI recommendations
- Good feature-to-price ratio
- Easy to use
#### Cons
- Smaller company
- Fewer integrations
- Limited template library
- Basic customer support
**Why choose Moosend over AWeber:** Significantly lower pricing, full automation on all plans, AI features included, and better value for the features provided.
### 12. Drip
**Best for:** E-commerce businesses wanting CRM-level customer data
Drip positions itself as an e-commerce CRM, combining customer relationship management with email marketing. Its deep integration with e-commerce platforms provides insights beyond what AWeber offers.
#### Key Features
- **E-commerce CRM** - Customer data platform
- **Visual workflow builder** - Sophisticated automation
- **Revenue attribution** - Track email impact
- **Behavioral triggers** - Action-based automation
- **On-site popups** - Lead capture tools
- **Segmentation** - Advanced customer filtering
#### Pricing model
Drip pricing scales with list size. It makes the most sense when ecommerce CRM data, workflow depth, and revenue attribution justify a higher-cost specialized platform.
#### Pros
- E-commerce CRM capabilities
- Deep behavioral tracking
- Revenue attribution
- Powerful automation
- Good Shopify integration
#### Cons
- Higher starting price
- No free plan
- E-commerce focus only
- Can be complex to set up
**Why choose Drip over AWeber:** E-commerce CRM functionality, deeper customer insights, revenue attribution, and more sophisticated behavioral automation.
### Feature Comparison: AWeber vs Top Alternatives
| Feature | AWeber | Brevo | ActiveCampaign | Klaviyo |
|---------|--------|-------|----------------|---------|
| Email automation | Autoresponder-focused | Visual workflows | Deep branching | Ecommerce workflows |
| SMS marketing | Limited | Available globally | Available separately | Available |
| WhatsApp | No | Yes | No | No |
| CRM | Limited | Built-in CRM | Built-in CRM | Customer profiles |
| Pricing model | Subscriber tiers | Send-volume tiers | Contact tiers | Profile and message tiers |
### How to Choose the Right AWeber Alternative
#### For E-commerce Businesses
E-commerce requires deep integration with your store, behavioral triggers, and multi-channel capabilities. Klaviyo excels at data analytics, while Omnisend offers strong omnichannel capabilities.
#### For Content Creators
**Recommended: Kit (ConvertKit) or MailerLite**
Creators need subscriber management, clean landing pages, and monetization options. Kit is purpose-built for creators with paid newsletters and tip features. MailerLite offers an excellent free plan with clean design tools.
#### For Small Businesses on a Budget
**Recommended: MailerLite or Moosend**
Both are worth comparing when cost control matters more than deep CRM or ecommerce data. Verify current free-tier limits, subscriber tiers, automation access, and support before choosing either one as the long-term platform.
#### For Advanced Marketing Teams
**Recommended: ActiveCampaign or Brevo**
Teams needing sophisticated automation should consider ActiveCampaign's industry-leading workflows. Brevo offers multi-channel orchestration across email, SMS, and WhatsApp at a more accessible price point.
#### For Beginners
**Recommended: Mailchimp or MailerLite**
Both offer intuitive interfaces and gentle learning curves. Mailchimp is the most widely recognized, while MailerLite provides better value for money.
Decision: Who is replacing AWeber?
- If Content creator: Kit or MailerLite (Subscriber management, landing pages, monetization.)
- If Small business on a budget: MailerLite or Moosend (Cost control over deep CRM or store data.)
- If Advanced marketing team: ActiveCampaign or Brevo (Deep workflows, or orchestration across email, SMS, WhatsApp.)
- If Beginner: Mailchimp or MailerLite (Intuitive interfaces and gentle learning curves.)
### Migration Tips: Moving from AWeber
#### 1. Export Your Data
Before switching, download all critical data from AWeber:
- Subscriber lists with tags and segments
- Email templates you want to recreate
- Automation workflows documentation
- Historical performance reports
#### 2. Choose Your New Platform
Based on this guide, select the platform that best matches your needs:
- **Advanced automation:** ActiveCampaign
- **Budget-friendly:** MailerLite or Moosend
- **Creator-focused:** Kit (ConvertKit)
#### 3. Set Up Your New Account
Most platforms offer import tools for AWeber contacts. Ensure you:
- Import contacts with all tags and custom fields
- Recreate critical automation workflows
- Test email templates before going live
- Verify domain authentication
#### 4. Run in Parallel
Consider running both platforms briefly to ensure:
- All automations function correctly
- Deliverability remains strong
- Data syncs properly
- Team is trained on new platform
#### 5. Sunset AWeber
Once confident in your new platform:
- Disable AWeber automations
- Export final data backup
- Cancel AWeber subscription
- Monitor new platform performance
Sequence, triggered by: Decision to leave AWeber
1. Export your data
2. Choose your new platform
3. Set up the new account
4. Run in parallel
5. Sunset AWeber
### Conclusion
AWeber's recent pricing changes and limited feature development have created an opportunity for businesses to find better email marketing solutions. Whether you prioritize advanced automation, e-commerce integration, multi-channel marketing, or simply better value for money, the alternatives in this guide offer compelling reasons to switch.
For other use cases, ActiveCampaign leads in automation sophistication, MailerLite excels in value for money, and Kit serves content creators best. The right choice depends on your specific needs, but all options in this guide represent improvements over AWeber's current offering.
Ready to upgrade your email marketing?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**How do I choose the right alternative?**
Choose by the job AWeber performs today: newsletters, autoresponders, landing pages, creator monetization, ecommerce automation, or CRM. Then compare pricing model, subscriber rules, automation depth, deliverability controls, integrations, and migration effort.
**Is it hard to switch email marketing platforms?**
A newsletter-only migration can be quick, but a serious move still requires contact export, field and tag mapping, suppression-list handling, template rebuilds, domain authentication, forms, automations, and a parallel-send test.
**Should I choose a cheaper alternative?**
Choose a lower-cost tool only if it still covers the workflows that drive revenue or retention. A cheaper plan can become expensive if it forces manual work, weaker segmentation, or another paid tool for SMS, CRM, or ecommerce data.
**What free AWeber alternative should I compare first?**
Compare Brevo if you want unlimited contact storage with send-volume economics, MailerLite if you want the simplest newsletter workflow, and Kit if your list is creator-led. Free-plan limits change, so verify subscriber caps, send caps, branding, automation access, and support before migrating.
**Is ActiveCampaign worth the higher price over AWeber?**
For businesses that rely on sophisticated automation and need CRM functionality, ActiveCampaign's higher price is justified. Its automation capabilities are significantly more advanced than AWeber's basic offerings, making it worthwhile for marketing teams that will use these features.
**What is the most affordable AWeber alternative with good automation?**
Moosend and MailerLite are both worth comparing when automation budget is tight. Moosend tends to emphasize budget automation depth, while MailerLite is often easier for simple newsletter and signup-form workflows. Verify current feature gates and plan limits before deciding.
**Can I migrate my AWeber subscribers to a new platform easily?**
Yes, major email marketing platforms support importing contacts from AWeber via CSV export. Most also support tags and custom fields, but you should test field mapping, suppression lists, automations, forms, and domain authentication before switching all sends.
**Which AWeber alternative works best for international SMS marketing?**
Brevo offers the best international SMS coverage with availability in 200+ countries. This contrasts sharply with AWeber's limited SMS capabilities and Mailchimp's US-only SMS. For global businesses, Brevo's multi-channel approach is unmatched.
**Does AWeber offer anything competitors do not?**
AWeber pioneered many email marketing features and maintains strong deliverability. However, most modern platforms have caught up or surpassed AWeber in features while offering better pricing. AWeber's main advantage is its long track record, but this no longer justifies its premium pricing for most users.
**What is the easiest AWeber alternative for beginners?**
Mailchimp and MailerLite offer the gentlest learning curves for beginners. Both feature intuitive drag-and-drop editors, helpful tutorials, and straightforward interfaces. MailerLite provides better value, while Mailchimp offers more brand recognition and a larger template library.
---
## B2B Email Marketing Guide: Segmentation, CRM Data, Deliverability, and Automation (2026)
Source: https://tajo.io/blog/b2b-email-marketing-guide/
Published: 2025-03-08 · Updated: 2026-05-17
Plan B2B email marketing around buyer stages, CRM data, segmentation, nurture sequences, ABM, deliverability, compliance, and sales handoff.
Summary: B2B email works when every message is tied to buyer stage, account fit, CRM data, and a clear next action. Build fewer, stronger segments; authenticate your domain; respect consent rules; and measure pipeline movement instead of chasing generic open-rate benchmarks.
B2B email marketing remains one of the highest-leverage channels available because it connects marketing activity to buyer education, CRM records, sales follow-up, and customer retention. The trap is treating B2B email like a broadcast newsletter. Business buyers move through a longer process, bring more stakeholders into the decision, and expect relevant follow-up based on what they have already told you or done.
### B2B vs. B2C Email Marketing: Key Differences
Before diving into strategies, understanding the fundamental differences between B2B and B2C email marketing sets the foundation for success.
#### Decision-Making Process
| Factor | B2B Email Marketing | B2C Email Marketing |
|--------|---------------------|---------------------|
| Decision makers | Multiple stakeholders across user, technical, economic, and executive roles | Usually one buyer or household |
| Sales cycle | Longer evaluation and procurement window | Minutes to weeks |
| Purchase motivation | ROI, efficiency, business value | Emotion, personal benefit |
| Email content focus | Education, case studies, ROI data | Product features, offers, urgency |
| Relationship building | Essential, long-term focus | Important but transactional |
| Send frequency | Less frequent, higher value | More frequent, promotional |
#### Content and Messaging Approach
**B2B emails should:**
- Address business pain points and challenges
- Provide educational value in every message
- Include data, statistics, and proof points
- Speak to multiple stakeholders with different concerns
- Build credibility through thought leadership
**B2C emails typically:**
- Appeal to emotional triggers
- Create urgency through limited offers
- Focus on product benefits and features
- Drive immediate action
- Use promotional language
#### Email Metrics That Matter
| Metric | How to use it in B2B |
|--------|----------------------|
| Delivery rate | Confirms authentication, suppression, and list hygiene are working |
| Open rate | Directional signal only, affected by privacy features and inbox behavior |
| Click rate | Better indicator of topic-market fit than opens |
| Reply or demo rate | Strong signal for sales-assist and ABM emails |
| Pipeline influenced | Connects email engagement to CRM opportunities |
| Unsubscribe and complaint rate | Early warning that targeting or consent is weak |
The key difference: B2B email should be judged by qualified movement through the buying process, not by generic campaign averages.
---
### Building Your B2B Email List the Right Way
Quality trumps quantity in B2B email marketing. A smaller list of qualified decision-makers and influencers will outperform a large list of unverified contacts.
#### High-Quality Lead Generation Tactics
**Content-Based List Building:**
- **Gated whitepapers and research reports** - Industry research drives qualified signups
- **Webinar registrations** - Live events attract engaged prospects
- **Free tools and calculators** - Interactive resources capture intent data
- **Newsletter subscriptions** - Thought leadership attracts ongoing interest
- **Demo requests** - High-intent, sales-ready leads
**Event-Based Acquisition:**
- Trade show badge scans (with consent)
- Conference networking follow-ups
- Virtual event registrations
- Podcast guest outreach
- Partner co-marketing campaigns
#### Lead Qualification and Scoring
Not all leads deserve the same attention. Implement scoring to prioritize outreach.
**Behavioral Scoring:**
| Action | Points |
|--------|--------|
| Downloaded content | +5 |
| Attended webinar | +10 |
| Visited pricing page | +15 |
| Requested demo | +25 |
| Opened 3+ emails in week | +5 |
| Clicked product comparison | +10 |
| Viewed case study | +8 |
| Unsubscribed | Remove from sales |
**Firmographic Scoring:**
| Attribute | Points |
|-----------|--------|
| Target company size | +10-20 |
| Target industry | +15 |
| Decision-maker title | +15 |
| Geographic match | +5 |
| Tech stack fit | +10 |
#### List Hygiene and Maintenance
B2B lists degrade faster than B2C (job changes, company changes). Maintain quality with:
- **Quarterly list cleaning** - Remove bounces and inactive contacts
- **Re-engagement campaigns** - Win back dormant subscribers before removing
- **Data enrichment** - Update job titles, companies, and firmographics
- **Preference centers** - Let contacts update their information
- **Consent management** - Maintain compliance documentation
---
### B2B Lead Nurturing Email Sequences
Lead nurturing converts cold prospects into sales-ready opportunities. Effective nurturing addresses buyer concerns at each stage.
#### Top-of-Funnel (TOFU) Nurture Sequence
**Goal:** Build awareness and establish credibility
**Trigger:** New contact enters database (content download, webinar signup)
**Sequence Structure:**
Sequence, triggered by: Content download or webinar signup
1. Welcome + content delivery
2. Related educational resource
3. Industry insights and trends
4. Case study introduction
5. Engagement check + content offer
**Email 1: Welcome and Content Delivery**
**Email 2: Related Educational Resource**
**Email 3: Industry Insights**
#### Middle-of-Funnel (MOFU) Nurture Sequence
**Goal:** Build consideration and demonstrate value
**Trigger:** Contact engages with TOFU content (downloads, webinar attendance, multiple page views)
**Sequence Structure:**
Sequence, triggered by: Engages with top-of-funnel content
1. Case study from their industry
2. Comparison or buyer's guide
3. Customer success story video
4. ROI calculator or assessment
5. Soft demo or consultation offer
**Email 1: Industry-Specific Case Study**
**Email 2: Comparison/Buyer's Guide**
#### Bottom-of-Funnel (BOFU) Nurture Sequence
**Goal:** Convert to sales opportunity
**Trigger:** High engagement score, pricing page visit, demo request page visit
**Sequence Structure:**
Sequence, triggered by: High engagement score or pricing page visit
1. Personalized value proposition
2. Specific ROI analysis
3. Decision-maker social proof
4. Limited consultation offer
5. Direct ask for a meeting
Outcome: Sales opportunity
**Email 1: Personalized Value Proposition**
---
### Account-Based Marketing (ABM) Email Strategies
ABM flips traditional marketing by targeting specific high-value accounts with personalized outreach. Email is central to ABM success.
#### Identifying Target Accounts
**Account Selection Criteria:**
- Annual revenue fit ($X-$Y range)
- Employee count match
- Industry alignment
- Technology stack compatibility
- Geographic presence
- Growth indicators (hiring, funding, expansion)
**Creating Account Tiers:**
| Tier | Accounts | Personalization Level | Email Approach |
|------|----------|----------------------|----------------|
| Tier 1 | 10-25 | Highly personalized, 1:1 | Custom campaigns per account |
| Tier 2 | 25-100 | Segment personalized | Industry + persona customization |
| Tier 3 | 100-500 | Light personalization | Automated with dynamic content |
#### Multi-Stakeholder Email Campaigns
B2B purchases involve multiple decision-makers. Map and engage the entire buying committee.
**Typical Buying Committee:**
| Role | Concerns | Email Content Focus |
|------|----------|---------------------|
| Economic Buyer (CFO, VP) | ROI, risk, budget | Business case, ROI data, risk mitigation |
| Technical Buyer (IT, Engineering) | Integration, security, implementation | Technical specs, architecture, security docs |
| User Buyer (End users, Managers) | Usability, daily workflow | Product demos, user testimonials, training |
| Champion (Internal Advocate) | Making the case internally | Sales enablement content, competitive info |
| Blocker (Skeptic) | Maintaining status quo | Risk of inaction, competitive pressure |
**Multi-Thread Email Example (Tier 1 Account):**
**To Champion:**
**To Technical Buyer (same account):**
#### ABM Campaign Orchestration
**Tier 1 Account Email Cadence:**
```
Week 1:
- Day 1: Personalized intro to Champion
- Day 3: LinkedIn connection requests to buying committee
- Day 5: Relevant industry insight to Champion
Week 2:
- Day 8: Technical resources to Technical Buyer
- Day 10: Executive brief to Economic Buyer
- Day 12: Check-in with Champion
Week 3:
- Day 15: Case study to all stakeholders
- Day 17: Custom demo offer to Champion
- Day 19: Follow-up on demo scheduling
Week 4:
- Day 22: Decision-maker testimonial video
- Day 24: ROI calculator results
- Day 26: Meeting request
```
---
### Sales Enablement Email Templates
Effective B2B email marketing requires tight alignment between marketing and sales.
#### Sales Follow-Up Templates
**Post-Demo Follow-Up:**
**Proposal Follow-Up:**
#### Re-Engagement for Stalled Deals
**Deal Gone Cold (30 days no response):**
**Competitive Win-Back:**
---
### B2B Email Personalization and Segmentation
Generic blasts don't work in B2B. Effective personalization goes far beyond "Hi [FirstName]."
#### Segmentation Strategies for B2B
**Firmographic Segmentation:**
- Company size (SMB, mid-market, enterprise)
- Industry vertical
- Geographic region
- Tech stack and tools used
- Growth stage (startup, scaling, mature)
**Behavioral Segmentation:**
- Content engagement type (product vs. educational)
- Website behavior (pages visited, time spent)
- Email engagement history
- Webinar/event attendance
- Sales interaction history
**Buyer Journey Segmentation:**
- Awareness stage (educational content)
- Consideration stage (comparison content)
- Decision stage (case studies, ROI data)
- Customer (onboarding, expansion, renewal)
#### Dynamic Content Examples
**Industry-Specific Hero Sections:**
```
{% if industry == "Financial Services" %}
How leading banks reduce compliance risk
{% elif industry == "Healthcare" %}
How healthcare providers improve patient engagement
{% elif industry == "Manufacturing" %}
How manufacturers streamline supply chain operations
{% else %}
How leading companies solve [challenge]
{% endif %}
```
**Company Size Messaging:**
```
{% if employee_count > 1000 %}
Enterprise-grade security and scalability for global teams
{% elif employee_count > 100 %}
Scalable solutions that grow with mid-market companies
{% else %}
Startup-friendly pricing with enterprise features
{% endif %}
```
#### Personalization Data to Capture
| Data Point | Source | Personalization Use |
|------------|--------|---------------------|
| Job title | Form, LinkedIn | Content matching, messaging |
| Company name | Form, enrichment | Account personalization |
| Industry | Form, enrichment | Case studies, examples |
| Tech stack | Form, data provider | Integration messaging |
| Content downloads | Tracking | Follow-up content |
| Web pages visited | Analytics | Interest targeting |
| Email engagement | Email platform | Send time, frequency |
| Previous purchases | CRM | Cross-sell, upsell |
---
### Measuring B2B Email Marketing Success
Track the right metrics to understand performance and optimize campaigns.
#### Email Performance Metrics
**Engagement Metrics:**
| Metric | How to read it |
|--------|----------------|
| Delivery rate | Whether authentication, suppression, and list hygiene are working |
| Open rate | Directional signal for subject line and sender recognition |
| Click rate | Stronger signal for offer and content relevance |
| Reply or meeting rate | Useful for sales-assist and ABM campaigns |
| Unsubscribe and complaint rate | Warning that targeting, consent, or frequency is off |
| Bounce rate | Signal that source data or enrichment quality needs work |
**Business Impact Metrics:**
| Metric | How to track | How to set the target |
|--------|--------------|-----------------------|
| Marketing Qualified Leads (MQLs) | Scoring threshold reached | Match sales capacity and qualification quality |
| Sales Qualified Leads (SQLs) | Sales accepts lead | Calibrate against historical handoff quality |
| Opportunities created | Email-sourced or email-influenced opportunities | Compare by campaign and segment |
| Pipeline generated | Opportunity value tied to campaign touches | Tie to revenue model and sales cycle |
| Revenue influenced | Closed deals touched by email | Track with multi-touch attribution |
#### Attribution for Long Sales Cycles
B2B sales involve many touchpoints. Proper attribution is essential.
**Attribution Models:**
- **First touch** - Credit to first email interaction
- **Last touch** - Credit to final email before conversion
- **Linear** - Equal credit across all touches
- **Time decay** - More credit to recent interactions
- **Position-based** - Heavier credit to first and last touches, with partial credit to the middle
**Recommended Approach:**
Use multi-touch attribution that tracks email's role across:
- Initial lead capture
- Nurture engagement
- Sales handoff
- Deal progression
- Closing influence
---
### B2B Email Deliverability Best Practices
Poor deliverability undermines even the best B2B campaigns.
#### Technical Setup Requirements
**Essential Authentication:**
- **SPF (Sender Policy Framework)** - Authorizes sending servers
- **DKIM (DomainKeys Identified Mail)** - Cryptographic signature
- **DMARC (Domain-based Message Authentication)** - Policy enforcement
**Domain Reputation Factors:**
- Sending volume consistency
- Bounce rate trends
- Spam complaint rate trends
- Engagement metrics (opens, clicks)
- List quality and hygiene
#### Avoiding B2B Spam Filters
**Content Best Practices:**
- Avoid excessive links
- Keep images purposeful and include a readable text version
- Don't use URL shorteners
- Avoid spam trigger words ("free," "guaranteed," "act now")
- Include plain text version
**List Hygiene:**
- Remove hard bounces immediately
- Suppress soft bounces after 3 attempts
- Clean inactive contacts quarterly
- Honor unsubscribes within 24 hours
- Verify new contacts before adding
#### Warm-Up for New Domains/IPs
**New sending domain schedule:**
| Stage | Volume posture | Focus |
|-------|----------------|-------|
| Start | Smallest controlled audience | Most engaged contacts |
| Expand | Gradual increases | Highly engaged segment |
| Validate | Continue only if bounces and complaints stay low | Engaged contacts |
| Scale | Broaden after reputation stabilizes | Larger opted-in audience |
---
### Conclusion
B2B email marketing succeeds through strategic patience, valuable content, and precise targeting. Unlike B2C campaigns focused on immediate transactions, B2B email builds relationships over months, engages multiple stakeholders, and supports complex buying decisions.
Key principles for B2B email success:
- **Quality over quantity** - Build lists of qualified decision-makers
- **Education over promotion** - Provide value in every email
- **Personalization at scale** - Segment and customize by role, industry, and stage
- **Multi-stakeholder awareness** - Address the entire buying committee
- **Sales alignment** - Coordinate marketing and sales touchpoints
- **Attribution tracking** - Measure across the complete buyer journey
Ready to build intelligent B2B email campaigns?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is B2B email marketing?**
B2B email marketing uses permission-based email to educate prospects, nurture buying committees, route qualified leads to sales, onboard customers, and retain accounts across a longer business buying cycle.
**How do I get started with B2B email marketing?**
Start by connecting email to your CRM, defining lifecycle stages, building a clean opt-in list, segmenting by firmographic and behavior data, and launching one nurture sequence with clear sales handoff rules.
**What are the best tools for B2B email marketing?**
The right tool depends on whether you need newsletter sending, automation, CRM, lead scoring, ABM, SMS, transactional messages, or sales reporting. Brevo, HubSpot, Mailchimp, and ActiveCampaign cover different parts of that stack.
**What is the ideal frequency for B2B email marketing?**
B2B email frequency depends on your audience, sales cycle, and content quality. Start with a sustainable cadence for nurture campaigns, then add behavior-triggered emails when they are useful. Quality matters more than quantity. Monitor unsubscribes, complaints, replies, and sales feedback; if negative signals rise, reduce frequency or tighten segmentation.
**How do I write B2B email subject lines that get opened?**
Effective B2B subject lines focus on relevance and value over cleverness. Use specific business outcomes, ask questions related to the recipient's challenge, reference their industry or role when you can do it honestly, and test concise mobile-friendly phrasing. Avoid spammy patterns like all caps, excessive punctuation, and manufactured urgency.
**Should I use HTML or plain text emails for B2B?**
Test both, but many B2B campaigns perform better with simple, text-focused designs. Highly designed HTML emails can trigger spam filters and look like marketing. A clean, professional format with minimal images often feels more personal and passes through corporate email filters more reliably. Use HTML for visual elements when needed (product screenshots, charts), but keep designs clean and professional.
**How do I handle multiple decision-makers in B2B email campaigns?**
Map the entire buying committee early: economic buyers (budget holders), technical buyers (IT/engineering), user buyers (end users), champions (internal advocates), and blockers (skeptics). Create content addressing each role's concerns. Use multi-threaded email campaigns that coordinate messaging across stakeholders. Enable your champion with content they can share internally, and track account-level engagement rather than just individual opens.
**What's the difference between MQL and SQL in email marketing?**
Marketing Qualified Leads (MQLs) have shown enough engagement to warrant marketing attention (content downloads, webinar attendance, multiple website visits). Sales Qualified Leads (SQLs) have been vetted by sales as ready for direct outreach (budget authority, clear timeline, defined need). Email marketing generates MQLs through nurture campaigns, then continues supporting them until they reach SQL status. Track both metrics and the conversion rate between them.
**How long should a B2B lead nurturing sequence be?**
Length depends on your typical sales cycle. Enterprise nurtures often span several months, while mid-market sequences can be shorter and more direct. Include exit conditions: if a lead engages heavily, fast-track to sales; if they disengage, move to a re-engagement flow. Do not keep nurturing forever; define endpoints and re-qualification criteria.
**What metrics matter most for B2B email marketing?**
While open and click rates indicate engagement, focus on business metrics: Marketing Qualified Leads (MQLs) generated, MQL-to-SQL conversion rate, opportunities created (with email attribution), pipeline value influenced, and ultimately revenue sourced from email. Track email's role across the entire buyer journey using multi-touch attribution, not just first or last touch. High open rates mean nothing if they don't eventually create pipeline.
**How do I integrate email with my B2B sales team?**
Alignment starts with shared definitions: what qualifies as MQL vs. SQL, when leads transfer to sales, and what information accompanies the handoff. Share email engagement data with sales through your CRM so reps see what content prospects engaged with. Create sales enablement email templates for common follow-up scenarios. Establish feedback loops so sales can report lead quality and marketing can adjust targeting and scoring accordingly.
---
## B2B Marketing Automation: Complete Implementation Guide
Source: https://tajo.io/blog/b2b-marketing-automation-guide/
Published: 2026-03-26 · Updated: 2026-05-06
Implement B2B marketing automation to generate leads, nurture prospects, and close deals faster. Step-by-step guide with workflows, tools, and best practices.
Summary: B2B marketing automation streamlines lead generation, nurturing, and sales alignment through automated workflows. This implementation guide covers platform selection, workflow design, lead scoring, and measuring ROI.
B2B marketing automation transforms how companies generate, nurture, and convert business leads. With sales cycles averaging 3 to 12 months and buying committees involving 6 to 10 stakeholders, manual marketing processes simply cannot scale. Automation bridges this gap by delivering the right content to the right decision-maker at the right stage -- consistently and without manual intervention.
Yet 49% of B2B companies still have not implemented marketing automation, and among those that have, many use only basic features. This implementation guide covers everything from platform selection to advanced workflow design, helping you build a B2B marketing automation system that genuinely drives pipeline and revenue.
### Understanding B2B Marketing Automation
#### What B2B Marketing Automation Actually Does
B2B marketing automation is not just scheduled email sending. It encompasses a connected system of tools and workflows that manage the entire buyer journey:
- **Lead capture and enrichment:** Automatically collect and enrich contact data from forms, website visits, and third-party sources
- **Lead scoring and qualification:** Assign scores based on fit and engagement to identify sales-ready prospects
- **Multi-touch nurturing:** Deliver personalized content sequences across email, ads, and web
- **Sales and marketing alignment:** Route qualified leads to sales with full context and activity history
- **Campaign orchestration:** Coordinate multi-channel campaigns from a single platform
- **Analytics and attribution:** Track which marketing activities drive pipeline and revenue
#### Why B2B Specifically Needs Automation
| B2B Challenge | How Automation Solves It |
|--------------|------------------------|
| Long sales cycles (3-12 months) | Automated nurture sequences maintain engagement over months |
| Multiple decision-makers | Multi-thread campaigns target different stakeholders |
| Complex buying processes | Content mapped to each buying stage delivered automatically |
| Sales-marketing misalignment | Shared lead scoring and automated handoff processes |
| Content-heavy buying journey | Triggered content delivery based on interest and behavior |
| Account-based selling | Coordinated multi-contact campaigns per account |
### Step-by-Step Implementation Guide
#### Phase 1: Foundation (Weeks 1-4)
**Define your goals and KPIs**
Before selecting tools, clarify what you need automation to achieve:
- Increase marketing qualified leads (MQLs) by X%
- Reduce lead response time to under Y minutes
- Improve lead-to-opportunity conversion rate
- Shorten average sales cycle by Z days
- Generate X% of pipeline from marketing automation
**Map your buyer journey**
Document the stages your buyers move through, from awareness to purchase:
| Stage | Buyer Action | Marketing Response | Content Type |
|-------|-------------|-------------------|--------------|
| Awareness | Researches problem | Attract with educational content | Blog posts, guides, industry reports |
| Consideration | Evaluates solutions | Nurture with comparison content | Whitepapers, webinars, case studies |
| Decision | Selects vendor | Enable with proof points | ROI calculators, demos, proposals |
| Purchase | Negotiates and buys | Support sales with targeted content | Testimonials, implementation guides |
**Audit existing processes**
Document your current marketing processes, identifying:
- Which tasks are repetitive and time-consuming
- Where leads drop off in the funnel
- What data you have and what you lack
- Current tools and integrations
#### Phase 2: Platform Selection (Weeks 3-6)
Choose a platform that matches your B2B requirements and budget.
| Platform | Best For | Starting Price | Key B2B Strengths |
|----------|---------|---------------|-------------------|
| Brevo | SMBs and mid-market | Free tier available | Email, CRM, SMS, automation in one |
| HubSpot | Inbound-focused teams | $800/mo (Professional) | Content, CRM, and automation |
| ActiveCampaign | Automation-heavy teams | $49/mo | Deep workflow logic |
| Marketo | Enterprise B2B | $895/mo | ABM, advanced scoring |
| Pardot | Salesforce users | $1,250/mo | Native Salesforce integration |
For B2B companies evaluating platforms in depth, see our [marketing automation platforms guide](/blog/marketing-automation-platforms-guide/) and [B2B marketing guide](/blog/b2b-marketing-guide/).
**Selection criteria to prioritize:**
- CRM integration depth (native vs. API)
- Lead scoring flexibility
- Multi-channel capabilities (email, ads, web)
- Reporting and attribution features
- Scalability as your team grows
- Implementation and onboarding support
#### Phase 3: Setup and Configuration (Weeks 5-10)
**Data migration and cleanup**
Clean your data before importing it into your new platform:
1. Deduplicate contacts and companies
2. Standardize field formats (job titles, industries, company sizes)
3. Verify email addresses with an [email verification service](/blog/email-verification-service-guide/)
4. Map custom fields between systems
5. Set up ongoing sync between CRM and automation platform
**Lead scoring model**
Build a scoring model that reflects your ideal customer profile and buying signals:
**Fit scoring (demographic/firmographic):**
- Company size matches ICP: +20 points
- Industry matches target: +15 points
- Job title is decision-maker: +15 points
- Geographic location: +5-10 points
**Engagement scoring (behavioral):**
- Downloaded gated content: +10 points
- Attended webinar: +15 points
- Visited pricing page: +20 points
- Requested demo: +30 points
- Email opened: +1 point
- Email clicked: +3 points
**Negative scoring:**
- Competitor domain: -50 points
- Student email: -30 points
- Unsubscribed from emails: -20 points
- No engagement in 60 days: -10 points
**MQL threshold:** Set your marketing qualified lead threshold (typically 50-80 points) and test it against historical conversion data.
#### Phase 4: Workflow Development (Weeks 8-14)
Build your core automation workflows in order of impact.
**Workflow 1: Lead capture and instant response**
Trigger: Form submission on website
Actions:
1. Add to CRM with source attribution
2. Send personalized thank-you email with requested content
3. Notify sales if lead score exceeds threshold
4. Add to appropriate nurture sequence
5. Create task for sales follow-up if high-fit lead
**Workflow 2: Multi-stage lead nurturing**
Build separate nurture tracks for different segments:
- **Top-of-funnel:** Educational content series (6-8 emails over 4-6 weeks)
- **Mid-funnel:** Solution-focused content (4-6 emails over 3-4 weeks)
- **Bottom-of-funnel:** Decision-support content (3-4 emails over 2 weeks)
Each track should include branch logic: if a contact engages with bottom-funnel content early, accelerate them to the decision stage rather than forcing them through the entire sequence.
**Workflow 3: Sales handoff and follow-up**
Trigger: Lead score reaches MQL threshold
Actions:
1. Update CRM stage to "Marketing Qualified"
2. Assign to sales rep based on territory or round-robin
3. Create sales task with full lead context
4. Send internal notification with lead score breakdown
5. Pause marketing nurture sequences
6. If sales does not engage within 48 hours, escalate
**Workflow 4: Post-demo follow-up**
Trigger: Demo completed (marked by sales in CRM)
Actions:
1. Send thank-you email with demo recording
2. Day 2: Case study relevant to prospect's industry
3. Day 5: ROI calculator or comparison guide
4. Day 8: Check-in from sales with next steps
5. If no response after 14 days: re-enter nurture with different angle
Sequence, triggered by: Demo completed, marked by sales in CRM
1. Thank-you email
2. Case study
3. ROI calculator or comparison guide
4. Check-in from sales
Outcome: No response after 14 days: re-enter nurture with a different angle
#### Phase 5: Launch and Optimization (Weeks 12+)
**Soft launch:** Start with a single workflow and a small segment. Monitor results for 2-4 weeks before expanding.
**Performance benchmarks for B2B automation:**
| Metric | Good | Excellent |
|--------|------|-----------|
| Nurture email open rate | 20-25% | 30%+ |
| Nurture click-through rate | 3-5% | 7%+ |
| MQL to SQL conversion | 15-20% | 30%+ |
| Lead response time | Under 1 hour | Under 5 minutes |
| Workflow completion rate | 50-60% | 70%+ |
| Pipeline from automation | 20-30% | 40%+ |
### Advanced B2B Automation Strategies
#### Account-Based Marketing (ABM) Automation
For high-value target accounts, build coordinated campaigns that reach multiple stakeholders:
1. Identify target accounts and key contacts
2. Create account-level scoring (aggregate of individual scores)
3. Trigger multi-thread email sequences targeting different roles
4. Coordinate with sales on outreach timing
5. Use website personalization for target account visitors
6. Track account-level engagement, not just individual metrics
#### Multi-Channel B2B Automation
Email remains the backbone, but modern B2B automation extends across channels:
- **LinkedIn integration:** Trigger connection requests or InMail after email engagement
- **Retargeting ads:** Add engaged leads to custom audiences for display and social ads
- **Direct mail:** Trigger physical mailers for high-value prospects
- **SMS:** Use [SMS marketing](/blog/sms-marketing-complete-guide/) for event reminders and time-sensitive communications
- **Webinar follow-up:** Automate post-webinar sequences based on attendance and engagement
#### Content-Triggered Workflows
Instead of linear sequences, build content-triggered workflows that respond to what prospects actually consume:
- Downloaded a pricing guide? Skip to bottom-funnel nurture.
- Watched a product video? Trigger demo invitation.
- Read three blog posts in one session? Send a related gated asset.
- Visited the careers page? Deprioritize as a potential customer lead.
Decision: What did the prospect consume?
- If A pricing guide: Skip to bottom-funnel nurture
- If A product video: Trigger a demo invitation
- If Three blog posts in one session: Send a related gated asset
- If The careers page: Deprioritize as a customer lead
### Measuring B2B Marketing Automation ROI
#### Attribution Models for B2B
B2B buying involves multiple touches over months. Use multi-touch attribution to understand which automated touchpoints drive results:
- **First-touch:** Which automation first captured the lead
- **Last-touch:** Which automation directly preceded conversion
- **Linear:** Equal credit to all automation touchpoints
- **Time-decay:** More credit to recent touchpoints
- **Custom weighted:** Assign weights based on your sales process
#### ROI Calculation
Calculate your marketing automation ROI quarterly:
**Investment:** Platform cost + implementation time + content creation + ongoing management
**Returns:**
- Pipeline generated from automated campaigns
- Revenue from automation-influenced deals
- Time saved from manual process elimination
- Improved conversion rates across the funnel
Most B2B companies see positive ROI within 6-12 months of proper implementation. For detailed ROI tracking frameworks, see our [email marketing ROI guide](/blog/email-marketing-roi-guide/).
### Common B2B Marketing Automation Mistakes
**Starting too complex:** Build one workflow at a time. Master lead nurturing before attempting multi-channel ABM campaigns.
**Ignoring content:** Automation without quality content is just automated spam. Invest in [content marketing](/blog/the-12-best-content-marketing-tools/) alongside your automation platform.
**Misaligned scoring:** If sales rejects your MQLs, your scoring model needs recalibration. Review scoring monthly with sales feedback.
**No sales involvement:** Marketing automation fails without sales buy-in. Include sales in planning, scoring definitions, and SLA agreements.
**Over-communicating:** Even with automation, B2B prospects do not want daily emails. Respect frequency preferences and build send limits into your workflows.
### Getting Started Today
B2B marketing automation is not a luxury -- it is a competitive necessity. Companies that automate their marketing processes generate 2x more leads and experience 77% higher conversion rates than those relying on manual processes.
Start with these three actions:
1. **Audit your current lead management process** to identify the highest-impact automation opportunity
2. **Select a platform** that fits your budget and integrations -- Brevo offers a strong starting point with its free tier and native [CRM capabilities](/blog/brevo-crm-guide/)
3. **Build your first lead nurture workflow** and measure its impact over 30 days
From there, expand systematically. Add lead scoring, build additional workflows, integrate more channels, and continuously optimize based on data. The companies that master B2B marketing automation build a sustainable advantage that compounds over time.
### Frequently asked questions
**What is B2B marketing automation?**
B2B marketing automation uses software to automate repetitive marketing tasks like email sequences, lead scoring, and campaign management. It helps B2B companies nurture prospects through long sales cycles and align marketing with sales teams.
**How much does B2B marketing automation cost?**
Costs range from free (Brevo's free tier) to $2,000+ per month for enterprise solutions. Most mid-market B2B companies spend $200-800 per month on marketing automation. The ROI typically justifies the investment within 6-12 months.
**What is the best marketing automation platform for B2B?**
The best platform depends on your needs and budget. Brevo offers strong B2B automation with a free tier. HubSpot excels at inbound marketing. ActiveCampaign provides deep automation. Marketo and Pardot serve enterprise B2B organizations.
---
## B2B Marketing: The Complete Guide to Strategies, Channels, and Lead Generation
Source: https://tajo.io/blog/b2b-marketing-guide/
Published: 2026-03-08 · Updated: 2026-05-18
Master B2B marketing with proven strategies for lead generation, nurturing, and conversion. Learn how to leverage email, content, and multi-channel campaigns to drive business growth.
Summary: B2B buying is a committee decision across a long cycle, so the work is nurturing rather than converting. Produce content for each role in the buying group, score leads on fit and intent together, and report pipeline contribution instead of open rates.
B2B marketing has evolved dramatically in recent years. Today's business buyers expect personalized experiences, valuable content, and seamless multi-channel engagement. Understanding how to reach, engage, and convert business customers is essential for sustained growth.
This comprehensive guide covers everything you need to know about B2B marketing, from foundational strategies to advanced lead generation and nurturing techniques.
### What is B2B Marketing?
**B2B marketing** (business-to-business marketing) encompasses all marketing strategies and tactics used to promote products or services to other businesses rather than individual consumers. Unlike B2C marketing, B2B focuses on building relationships with decision-makers, addressing complex business needs, and demonstrating clear ROI.
#### B2B vs. B2C Marketing
| Factor | B2B Marketing | B2C Marketing |
|--------|---------------|---------------|
| Decision makers | Multiple stakeholders | Individual consumer |
| Sales cycle | Weeks to months | Minutes to days |
| Purchase motivation | ROI, efficiency, solutions | Emotion, price, convenience |
| Relationship focus | Long-term partnerships | Transactional |
| Content style | Educational, detailed | Entertaining, concise |
| Average deal size | Higher value | Lower value |
#### The Modern B2B Buyer
Today's B2B buyers conduct extensive research before engaging with sales teams:
- **70% of the buyer journey** happens before contacting sales
- **77% of B2B buyers** describe their most recent purchase as complex
- **6-10 decision-makers** are typically involved in B2B purchases
- **Digital channels** now influence over 80% of B2B buying decisions
### Core B2B Marketing Strategies
#### 1. Account-Based Marketing (ABM)
ABM focuses marketing resources on specific high-value target accounts rather than broad market segments.
**Key ABM Components:**
- **Account selection** - Identify ideal customer profiles and high-value prospects
- **Personalized campaigns** - Create tailored content for each account
- **Multi-channel coordination** - Orchestrate outreach across email, social, and direct mail
- **Sales alignment** - Close collaboration between marketing and sales teams
- **Measurement** - Track engagement and pipeline impact per account
**ABM Tiers:**
| Tier | Accounts | Approach | Resources |
|------|----------|----------|-----------|
| One-to-One | 10-50 | Fully customized | High investment |
| One-to-Few | 50-200 | Cluster personalization | Medium investment |
| One-to-Many | 200+ | Programmatic targeting | Lower per-account investment |
#### 2. Content Marketing
Content marketing establishes thought leadership and attracts qualified prospects through valuable educational content.
**Effective B2B Content Types:**
- **Whitepapers** - In-depth research and analysis
- **Case studies** - Customer success stories with measurable results
- **Blog posts** - Educational articles addressing pain points
- **Webinars** - Interactive educational sessions
- **Video content** - Product demos, thought leadership, tutorials
- **Industry reports** - Original research and benchmarking data
- **Podcasts** - Expert interviews and industry insights
**Content Strategy Framework:**
1. **Define buyer personas** - Understand your target audience
2. **Map the buyer journey** - Create content for each stage
3. **Establish content pillars** - Core topics that support business goals
4. **Develop a content calendar** - Plan production and distribution
5. **Optimize for search** - Ensure discoverability through SEO
6. **Measure and iterate** - Track performance and refine approach
#### 3. Search Engine Optimization (SEO)
B2B SEO captures demand from buyers actively searching for solutions.
**B2B SEO Focus Areas:**
- **Keyword research** - Target high-intent business keywords
- **Technical SEO** - Site speed, mobile optimization, crawlability
- **On-page optimization** - Content structure, meta tags, internal linking
- **Link building** - Earn backlinks from industry publications
- **Local SEO** - Optimize for location-based searches if relevant
**B2B Keyword Categories:**
| Category | Example | Intent |
|----------|---------|--------|
| Problem-aware | "improve sales efficiency" | Top of funnel |
| Solution-aware | "CRM software features" | Middle of funnel |
| Product-aware | "Salesforce vs HubSpot" | Bottom of funnel |
| Transactional | "enterprise CRM pricing" | Purchase ready |
#### 4. Paid Advertising
Strategic paid campaigns accelerate reach and generate qualified leads.
**B2B Advertising Channels:**
- **LinkedIn Ads** - Professional targeting by job title, company size, industry
- **Google Ads** - Capture high-intent search traffic
- **Programmatic display** - Reach target accounts across the web
- **Retargeting** - Re-engage website visitors
- **Sponsored content** - Native advertising in industry publications
**LinkedIn Advertising Best Practices:**
- Use matched audiences for ABM campaigns
- Target by job function, seniority, and company attributes
- Test single image, carousel, and video formats
- Lead gen forms capture contacts without landing pages
- Budget minimums typically $10/day for sponsored content
#### 5. Social Media Marketing
B2B social media builds brand awareness, engages prospects, and supports sales.
**Platform Strategy:**
| Platform | Best For | Content Type |
|----------|----------|--------------|
| LinkedIn | Professional networking, thought leadership | Articles, company updates, industry insights |
| Twitter/X | News, real-time engagement, customer service | Quick updates, threads, industry commentary |
| YouTube | Product education, webinar hosting | Tutorials, demos, customer stories |
| Facebook | Community building, retargeting | Company culture, events, light content |
**Employee Advocacy:**
Empower employees to share company content:
- 14x higher engagement than brand posts
- Extends reach to personal networks
- Builds trust through human connections
### B2B Email Marketing
Email remains the most effective B2B marketing channel, delivering an average ROI of $42 for every $1 spent. For B2B specifically, email drives more conversions than any other channel.
#### Building a Quality B2B Email List
Unlike B2C, B2B email lists focus on reaching decision-makers at target companies.
**List Building Strategies:**
- **Gated content** - Require email for whitepapers, reports, templates
- **Webinar registrations** - Capture leads through educational events
- **Newsletter signups** - Offer industry insights and news
- **Free tools and calculators** - Exchange value for contact information
- **Event attendance** - Collect business cards, badge scans
- **LinkedIn connections** - Move relationships off-platform
**List Quality Indicators:**
| Metric | Good | Needs Work |
|--------|------|------------|
| Open rate | Above 20% | Below 15% |
| Bounce rate | Under 2% | Above 5% |
| Unsubscribe rate | Under 0.5% | Above 1% |
| Reply rate | Above 1% | Below 0.5% |
#### B2B Email Segmentation
Effective segmentation dramatically improves engagement and conversion rates.
**B2B Segmentation Criteria:**
- **Company attributes** - Industry, size, revenue, location
- **Role and seniority** - Job title, decision-making authority
- **Engagement level** - Email opens, clicks, website visits
- **Buyer journey stage** - Awareness, consideration, decision
- **Product interest** - Specific solutions or features viewed
- **Account status** - Prospect, customer, churned
#### Email Types for B2B
**Lead Nurturing Emails:**
Sequence, triggered by: Lead enters the nurturing sequence
1. Welcome
2. Industry insight article
3. Case study
4. Product comparison guide
5. Demo offer or consultation
**Sales Outreach Emails:**
- Personalized value proposition
- Reference to specific pain points
- Clear next step (call, demo, meeting)
- Follow-up sequence with varied approaches
**Customer Success Emails:**
- Onboarding sequences
- Feature education
- Usage tips and best practices
- Renewal reminders
- Upsell opportunities
#### B2B Email Best Practices
**Subject Lines:**
- Keep under 50 characters for mobile
- Personalize with company or name
- Test curiosity vs. direct approaches
- Avoid spam trigger words
**Email Copy:**
- Lead with value, not features
- Address specific pain points
- Use clear, professional language
- Include a single, clear CTA
- Keep paragraphs short (2-3 sentences)
**Timing and Frequency:**
- **Best days:** Tuesday, Wednesday, Thursday
- **Best times:** 10am-12pm, 2pm-4pm (recipient's time zone)
- **Frequency:** 1-4 emails per month for nurturing
- **Test your audience** - Optimal times vary by industry
#### Email Automation for B2B
Automation enables personalized communication at scale.
**Essential B2B Email Automations:**
1. **Welcome series** - Introduce new subscribers to your brand
2. **Lead scoring triggers** - Notify sales when leads are hot
3. **Behavior-based nurturing** - Respond to content engagement
4. **Re-engagement campaigns** - Activate dormant contacts
5. **Event-based sequences** - Webinar reminders, post-event follow-up
6. **Customer lifecycle** - Onboarding, renewal, expansion
**Example: Lead Nurturing Automation**
Sequence, triggered by: Downloads whitepaper
1. Email 1: Thank you
2. Email 2: Related blog post
3. Email 3: Case study
4. Email 4: Product overview
Outcome: Lead score check: transfer to sales or continue nurturing
### B2B Lead Generation
Lead generation is the foundation of B2B marketing success. Quality leads fuel the sales pipeline and drive revenue growth.
#### Lead Generation Channels
**Inbound Lead Generation:**
- **Content marketing** - Attract leads through valuable content
- **SEO** - Capture organic search traffic
- **Social media** - Build awareness and drive website visits
- **Referral programs** - Leverage customer networks
- **Webinars and events** - Educate and capture registrations
**Outbound Lead Generation:**
- **Cold email outreach** - Targeted prospecting campaigns
- **LinkedIn outreach** - Direct messaging to decision-makers
- **Cold calling** - Direct phone prospecting
- **Direct mail** - Physical outreach to key accounts
- **ABM campaigns** - Multi-channel account targeting
#### Lead Magnets That Convert
Effective lead magnets provide genuine value in exchange for contact information.
**High-Converting B2B Lead Magnets:**
| Lead Magnet | Conversion Rate | Best For |
|-------------|-----------------|----------|
| Industry reports | 15-25% | Thought leadership |
| ROI calculators | 20-40% | Bottom-funnel leads |
| Templates and toolkits | 15-30% | Practical value |
| Free trials | 10-20% | Product-qualified leads |
| Webinars | 20-40% | Education and engagement |
| Assessments | 30-50% | Qualification and personalization |
#### Landing Page Optimization
Conversion-focused landing pages maximize lead capture.
**Landing Page Best Practices:**
- **Single focus** - One offer, one CTA
- **Clear headline** - Communicate value immediately
- **Benefit-focused copy** - Address pain points and outcomes
- **Social proof** - Customer logos, testimonials, statistics
- **Minimal form fields** - Balance information needs with friction
- **Mobile optimization** - Responsive design and fast loading
- **A/B testing** - Continuously improve conversion rates
**Form Field Optimization:**
| Fields | Typical Conversion Impact |
|--------|--------------------------|
| Name + Email | Highest conversion |
| + Company | 10-15% reduction |
| + Phone | 15-20% reduction |
| + Company Size | 5-10% reduction |
| + Role/Title | 5-10% reduction |
#### Lead Qualification
Not all leads are created equal. Qualification ensures sales focuses on the best opportunities.
**Lead Qualification Frameworks:**
**BANT:**
- **Budget** - Can they afford your solution?
- **Authority** - Are they a decision-maker?
- **Need** - Do they have a problem you solve?
- **Timeline** - When do they plan to purchase?
**MEDDIC:**
- **Metrics** - What business impact are they seeking?
- **Economic buyer** - Who controls the budget?
- **Decision criteria** - How will they evaluate solutions?
- **Decision process** - What steps lead to purchase?
- **Identify pain** - What problems drive urgency?
- **Champion** - Who will advocate internally?
#### Lead Scoring
Lead scoring prioritizes prospects based on fit and engagement.
**Scoring Dimensions:**
| Category | Factors | Points |
|----------|---------|--------|
| Demographic | Job title, seniority | 1-20 |
| Firmographic | Company size, industry, revenue | 1-20 |
| Behavioral | Page views, content downloads | 1-10 per action |
| Engagement | Email opens, clicks, webinar attendance | 1-5 per action |
| Negative | Competitor, student, unsubscribes | -10 to -50 |
**Score Thresholds:**
- **0-30:** Cold lead - Nurture
- **31-60:** Warm lead - Continue nurturing, prioritize engagement
- **61-80:** Marketing qualified lead (MQL) - Sales review
- **81+:** Sales qualified lead (SQL) - Immediate sales outreach
Decision: What is the lead's score?
- If 0-30, cold lead: Nurture
- If 31-60, warm lead: Keep nurturing, prioritize engagement
- If 61-80, MQL: Sales review
- If 81+, SQL: Immediate sales outreach
### Lead Nurturing Strategies
Lead nurturing develops relationships with prospects over time, keeping your brand top-of-mind until they are ready to buy.
#### The Importance of Nurturing
- **80% of leads** never convert to sales without nurturing
- **Nurtured leads produce 50% more sales** at 33% lower cost
- **Average B2B sales cycle** is 3-6 months
- **Multiple touchpoints required** - typically 7-13 before conversion
#### Multi-Channel Nurturing
Effective nurturing spans multiple channels for maximum impact.
**Channel Mix:**
- **Email** - Primary nurturing channel (detailed content, automation)
- **Retargeting** - Keep brand visible across the web
- **Social media** - LinkedIn engagement and content sharing
- **SMS** - Time-sensitive notifications (events, deadlines)
- **Direct mail** - High-impact physical touchpoints
- **Phone calls** - Personal connection at key moments
#### Content for Each Buyer Stage
**Awareness Stage:**
- Educational blog posts
- Industry reports
- Infographics
- Social media content
**Consideration Stage:**
- Whitepapers
- Case studies
- Comparison guides
- Webinars
**Decision Stage:**
- Product demos
- Free trials
- Pricing information
- Implementation guides
- Customer testimonials
#### Nurturing Workflows
**Example: New Lead Nurturing Workflow**
Week 1:
- Day 0: Welcome email with top resource
- Day 2: Educational blog post
- Day 4: Retargeting ads begin
Week 2:
- Day 7: Industry insight or news
- Day 10: Related case study
Week 3:
- Day 14: How-to guide or template
- Day 16: LinkedIn connection request
Week 4:
- Day 21: Webinar invitation or event
- Day 25: Solution overview
Week 5:
- Day 28: Demo offer or consultation
- Day 30: Follow-up if no response
#### Personalization at Scale
Personalization improves nurturing effectiveness significantly.
**Personalization Levels:**
1. **Basic:** Name, company name
2. **Intermediate:** Industry-specific content, role-based messaging
3. **Advanced:** Behavior-triggered content, dynamic recommendations
4. **Hyper-personalized:** 1:1 ABM content, AI-driven customization
### B2B Marketing Metrics and KPIs
Measuring performance is essential for optimization and demonstrating marketing ROI.
#### Pipeline Metrics
| Metric | Definition | Target |
|--------|------------|--------|
| Marketing Qualified Leads (MQLs) | Leads meeting qualification criteria | Growth trajectory |
| Sales Qualified Leads (SQLs) | MQLs accepted by sales | 40-60% of MQLs |
| Sales Accepted Leads (SALs) | SQLs actively pursued | 70-80% of SQLs |
| Opportunities | Leads in active sales process | Track conversion rate |
| Pipeline value | Total potential revenue | 3-4x revenue target |
#### Conversion Metrics
| Stage | Benchmark Conversion Rate |
|-------|--------------------------|
| Visitor to lead | 2-5% |
| Lead to MQL | 15-30% |
| MQL to SQL | 40-60% |
| SQL to opportunity | 60-75% |
| Opportunity to close | 20-35% |
#### Engagement Metrics
**Email Metrics:**
- Open rate (benchmark: 20-25%)
- Click-through rate (benchmark: 3-5%)
- Reply rate (benchmark: 1-3%)
- Unsubscribe rate (benchmark: under 0.5%)
**Content Metrics:**
- Page views and time on page
- Downloads and form completions
- Social shares and engagement
- Backlinks earned
**Website Metrics:**
- Traffic by source
- Bounce rate by page
- Conversion rate by landing page
- User flow and drop-off points
#### Revenue Attribution
Understanding which marketing activities drive revenue guides investment decisions.
**Attribution Models:**
| Model | Description | Best For |
|-------|-------------|----------|
| First touch | 100% credit to first interaction | Awareness campaigns |
| Last touch | 100% credit to final interaction | Direct response |
| Linear | Equal credit across all touches | Balanced view |
| Time decay | More credit to recent interactions | Sales-focused analysis |
| Position-based | 40/20/40 first, middle, last | Comprehensive view |
| Data-driven | ML-based weighting | Advanced analytics |
#### Marketing ROI Calculation
```
Marketing ROI = (Revenue Attributed to Marketing - Marketing Cost) / Marketing Cost x 100
Example:
Revenue attributed: $500,000
Marketing cost: $100,000
ROI = ($500,000 - $100,000) / $100,000 x 100 = 400%
```
### Technology Stack for B2B Marketing
The right tools enable efficient execution and measurement.
#### Essential B2B Marketing Tools
**Marketing Automation:**
- Email automation and drip campaigns
- Lead scoring and routing
- Landing page builders
- Forms and progressive profiling
- Campaign management
**CRM Integration:**
- Centralized contact database
- Pipeline management
- Sales and marketing alignment
- Revenue tracking
**Analytics and Attribution:**
- Website analytics
- Marketing attribution
- Dashboard and reporting
- A/B testing platforms
**Content and SEO:**
- Content management systems
- SEO tools and keyword research
- Social media management
- Design and creative tools
#### Data Integration
Unified data across systems improves personalization and measurement.
**Key Integrations:**
- Marketing automation to CRM (lead sync, scoring)
- CRM to customer success (expansion opportunities)
- E-commerce to marketing (customer behavior)
- Analytics to marketing (attribution, optimization)
### Conclusion
B2B marketing success requires a strategic approach combining brand building, lead generation, and relationship nurturing. Focus on understanding your buyers, creating valuable content, leveraging multiple channels, and continuously measuring and optimizing performance.
The integration of marketing automation, CRM, and data analytics enables personalized communication at scale. By implementing the strategies outlined in this guide with the right technology foundation, you can build a predictable pipeline and drive sustainable business growth.
Ready to transform your B2B marketing?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is B2B marketing?**
Master B2B marketing with proven strategies for lead generation, nurturing, and conversion. Learn how to leverage email, content, and multi-channel campaigns to drive business growth.
**How do I get started with B2B marketing?**
Start with the fundamentals: understand core concepts, choose the right tools, and implement step by step. This guide covers everything from beginner to advanced.
**What are the best tools for B2B marketing?**
The best tools depend on your budget and needs. Brevo offers a comprehensive free tier covering email, SMS, CRM, and automation. See this guide for detailed recommendations.
**What is the difference between B2B and B2C marketing?**
B2B marketing targets businesses and focuses on demonstrating ROI, building relationships with multiple stakeholders, and supporting longer sales cycles. B2C marketing targets individual consumers with emotional appeals and shorter purchase decisions. B2B typically involves higher transaction values, more complex buying processes, and relationship-focused strategies.
**How long is a typical B2B sales cycle?**
B2B sales cycles typically range from 3 to 12 months, depending on deal size and complexity. Enterprise deals can take 12-18 months or longer. The cycle includes awareness, education, evaluation, negotiation, and implementation phases. Marketing plays a critical role in nurturing leads through the extended consideration period.
**What are the most effective B2B lead generation channels?**
The most effective channels vary by industry but commonly include content marketing and SEO for inbound leads, LinkedIn for professional outreach, email marketing for nurturing, and webinars for education and engagement. Many B2B companies find success combining inbound and outbound approaches with account-based marketing for high-value targets.
**How do you measure B2B marketing ROI?**
B2B marketing ROI is measured by tracking revenue attributed to marketing activities divided by marketing spend. This requires proper attribution models, CRM integration for revenue tracking, and clear definitions of marketing-sourced versus marketing-influenced revenue. Multi-touch attribution provides the most accurate picture for complex B2B sales.
**What is lead scoring and why is it important?**
Lead scoring assigns numerical values to leads based on demographic fit, firmographic attributes, and behavioral engagement. It helps prioritize leads for sales outreach, ensures sales focuses on the most qualified opportunities, and improves conversion rates by aligning follow-up timing with buyer readiness.
**How often should you email B2B leads?**
Email frequency depends on the buyer journey stage and engagement level. For nurturing, 1-4 emails per month is typical. Highly engaged leads may receive more frequent communication. The key is providing value with each message and monitoring engagement metrics to avoid fatigue. Always allow preference management.
**What is account-based marketing (ABM)?**
ABM is a B2B strategy that focuses marketing and sales resources on specific high-value target accounts rather than broad market segments. It involves identifying ideal customers, creating personalized campaigns for each account or account cluster, and coordinating multi-channel outreach to engage key stakeholders within target organizations.
**How do you align sales and marketing in B2B?**
Sales and marketing alignment requires shared definitions (MQL, SQL criteria), agreed lead handoff processes, regular communication, shared goals and metrics, integrated technology (CRM, marketing automation), and feedback loops for continuous improvement. Service-level agreements (SLAs) formalize expectations between teams.
**What content works best for B2B marketing?**
High-performing B2B content includes case studies demonstrating measurable results, industry research and benchmarking reports, practical guides and templates, comparison content for evaluation stages, and thought leadership positioning. The best content addresses specific pain points and provides actionable insights.
**How important is personalization in B2B marketing?**
Personalization significantly improves B2B marketing performance. Personalized emails generate 6x higher transaction rates. ABM campaigns rely on account-specific messaging. Modern B2B buyers expect relevant content tailored to their industry, role, and stage in the buying process. Technology enables personalization at scale through segmentation and automation.
---
## B2B Marketing Software Guide: CRM, Automation, Analytics, Lead Scoring, and Fit (2026)
Source: https://tajo.io/blog/b2b-marketing-software-guide/
Published: 2026-03-26 · Updated: 2026-05-06
Compare B2B marketing software by CRM fit, automation depth, email, analytics, lead scoring, attribution, pricing model, integrations, and buying stage.
Summary: The useful B2B marketing stack starts with CRM, email, automation, analytics, and content operations. Add prospecting, ABM, intent data, and advanced attribution only when your sales cycle, deal size, and account list justify the extra cost and governance.
B2B marketing runs on different mechanics than B2C. Sales cycles stretch across weeks or months, buying committees replace individual shoppers, and deal values are high enough that a single conversion can justify a whole quarter of effort. Your software stack has to support that reality: long-running nurture, account-based targeting, lead scoring, and tight alignment between marketing and sales.
The challenge in 2026 is not a shortage of tools. It is the opposite. The B2B martech landscape is crowded, and it is easy to assemble an expensive stack where half the tools overlap and none of them talk to each other. This guide breaks the market into the categories that actually matter, names the tools worth knowing in each, and shows how to build a stack that fits your stage rather than your fear of missing out. Pricing shifts often, so treat the figures here as recent reference points and confirm current rates before you buy.
### The categories of B2B marketing software
Every effective B2B stack covers a handful of jobs. You do not need a separate tool for each, and good all-in-one platforms collapse several into one. The categories:
| Category | Job to be done | Strong picks | Free option |
|----------|----------------|--------------|-------------|
| Email and automation | Nurture, newsletters, multi-step workflows | Brevo, ActiveCampaign, HubSpot | Brevo free plan |
| CRM | Contact, company, and deal management | Brevo CRM, HubSpot, Salesforce | Brevo and HubSpot free tiers |
| Analytics | Traffic, conversion, and attribution | Google Analytics 4 | Free |
| SEO and content | Organic visibility, keyword research | Ahrefs, Semrush | Limited free tools |
| Social and scheduling | LinkedIn presence, publishing | Buffer, Hootsuite | Free tiers |
| Prospecting and data | Find and qualify target accounts | LinkedIn Sales Navigator, ZoomInfo | Limited |
| ABM and intent | Identify and orchestrate target accounts | 6sense, Demandbase | Mostly paid |
| Scheduling and ops | Booking, integration, workflow glue | Calendly, Zapier | Free tiers |
The deeper your funnel and the larger your average deal, the further down this list you need to go. A two-person SaaS startup lives in the first four rows. An enterprise revenue team uses all of them.
### Best B2B marketing software by category
#### 1. Brevo, best all-in-one for lean B2B teams
Brevo combines email marketing, a built-in CRM, [marketing automation](/blog/marketing-automation-complete-guide/), [SMS](/blog/sms-marketing-complete-guide/), WhatsApp, and [transactional email](/blog/transactional-email-guide/) in a single platform. For small and mid-sized B2B teams, consolidating those jobs into one tool removes a lot of integration headaches.
**B2B strengths:**
- Built-in CRM with a deal pipeline on the free tier
- Visual automation with lead scoring
- Multichannel reach: email, SMS across 200+ countries, and WhatsApp
- Transactional API for product and account notifications
- Send-based pricing, so a large but lightly mailed list does not punish you
**Pricing model:** Free entry path, then send-volume and feature tiers. Confirm current send limits, branding, automation access, and multichannel usage costs on Brevo's pricing page.
**Honest note:** For the most intricate enterprise automation and native ABM, dedicated platforms still go deeper.
#### 2. HubSpot, best full marketing-and-sales suite
HubSpot is the reference point for an all-in-one B2B platform, unifying marketing, sales, and service on a single CRM.
**B2B strengths:**
- Comprehensive CRM with company records and associations
- Content, blog hosting, and landing pages
- Strong reporting and multi-touch attribution
- Sales tools tightly integrated with marketing
**Pricing model:** Free CRM entry point, then hub, seat, contact, and feature tiers. See [HubSpot alternatives](/blog/hubspot-alternatives/) for comparison.
#### 3. ActiveCampaign, best dedicated automation
ActiveCampaign is built around one of the most capable automation builders in the category, with conditional logic, splits, and predictive features for complex nurture.
**B2B strengths:**
- Advanced automation with branching and conditions
- Built-in CRM with sales automation
- Lead scoring and predictive sending
- Large integration ecosystem
**Pricing model:** Contact-based tiers with plan gates for CRM, automation, and advanced features. See our [ActiveCampaign alternatives](/blog/best-activecampaign-alternatives/).
#### 4. LinkedIn Sales Navigator, best for prospecting
Essential for B2B lead generation on LinkedIn.
**B2B strengths:**
- Advanced lead search filters
- InMail messaging
- CRM integration (Salesforce, HubSpot)
- Account-based targeting
**Pricing model:** Seat-based sales prospecting subscription. Verify current Sales Navigator tiers and CRM integration availability.
#### 5. Google Analytics 4, Best Free Analytics
Track website behavior, conversion paths, and marketing attribution.
**B2B strengths:**
- Multi-touch attribution models
- Custom event tracking
- Integration with Google Ads
- Free and comprehensive
**Pricing**: Free.
#### 6. Ahrefs, Best B2B SEO Tool
Track organic rankings, analyze competitors, and find content opportunities.
**B2B strengths:**
- Keyword research for B2B terms
- Competitor content gap analysis
- Backlink monitoring
- Content explorer for link building
**Pricing model:** Subscription tiers by feature access and usage. Verify current limits for tracked projects, credits, users, and exports.
#### 7. Calendly, Best Meeting Scheduling
Removes friction from the B2B booking process.
**B2B strengths:**
- Automated scheduling
- CRM integration
- Team scheduling and round-robin
- Custom booking pages
**Pricing model:** Free entry tier plus paid seat tiers. Verify routing, team scheduling, integrations, and workflow limits.
#### 8. Canva, Best B2B Design Tool
Create professional marketing materials without a designer.
**B2B strengths:**
- Presentation templates
- Social media graphics
- Case study and whitepaper layouts
- Brand kit management
**Pricing model:** Free entry tier plus paid user and team plans. Verify brand kit, template, export, and collaboration requirements.
#### 9. Slack, Best Team Communication
Coordinate marketing efforts and integrate with marketing tools.
**B2B strengths:**
- Channel-based communication
- Integration with marketing tools (alerts, reports)
- Workflow automation
- External partner collaboration
**Pricing model:** Free entry tier plus paid per-user plans. Verify message history, workflow, external collaboration, and compliance needs.
#### 10. Zapier, Best Integration Platform
Connect tools that do not have native integrations.
**B2B strengths:**
- Thousands of app integrations
- Automated workflows between tools
- Lead routing between marketing and sales
- Data sync without development
**Pricing model:** Free entry tier with task limits, then paid automation tiers. Verify task volume, premium app access, polling time, and error handling.
#### 11. 6sense or Demandbase, best for account-based marketing
Once you are running true account-based marketing, you need a platform that identifies in-market accounts, scores intent, and orchestrates campaigns across them. 6sense and Demandbase are the two names that dominate this category in 2026, using AI and intent data to surface accounts showing buying signals before they ever fill in a form.
**B2B strengths:**
- Account identification and intent scoring
- Predictive in-market account detection
- Multichannel orchestration against target accounts
- CRM and ad-platform integrations
**Pricing:** Enterprise, custom, and a meaningful investment. This category only pays off once your average deal size and account list justify it.
### B2B Marketing Automation Deep Dive
[Marketing automation](/blog/marketing-automation-complete-guide/) is the backbone of B2B marketing. Here is how to structure your automations:
#### Lead Nurture Sequence
| Stage | Trigger | Content | Goal |
|-------|---------|---------|------|
| Awareness | Downloads resource | Educational emails (3-5) | Build trust |
| Consideration | Visits pricing page | Case studies, comparisons | Prove value |
| Decision | Requests demo | ROI calculators, testimonials | Close deal |
| Post-sale | Becomes customer | Onboarding, training | Reduce churn |
#### Lead Scoring Model
| Action | Points | Reasoning |
|--------|--------|-----------|
| Opens email | +1 | Basic engagement |
| Clicks link | +3 | Active interest |
| Downloads resource | +5 | Solution awareness |
| Visits pricing page | +10 | Purchase intent |
| Requests demo | +20 | Sales ready |
| Job title match | +15 | Decision maker |
| Company size match | +10 | ICP fit |
When a lead reaches your threshold (e.g., 50 points), automatically route them to sales in your CRM.
### Building Your Stack on a Budget
#### Startup Stage
- Brevo free plan (email + CRM + automation)
- Analytics tool with basic event tracking
- Canva free plan
- Buffer free plan
Keep this stack minimal until one tool is directly tied to lead capture, sales handoff, or customer retention.
#### Growth Stage
- Paid email and automation tier when send volume or feature limits justify it
- SEO or content research platform when organic demand generation is active
- Scheduling and routing tool when demo volume creates friction
- Integration platform when manual handoffs create missed leads
#### Scale Stage
- Add ActiveCampaign or HubSpot for advanced automation
- LinkedIn Sales Navigator for prospecting
- Consider ABM and intent tools (6sense, Demandbase) once deal size justifies them
Decision: Which stage is your B2B team at?
- If Startup: Free plans only (Brevo free plan, basic analytics, Canva and Buffer free tiers.)
- If Growth: Paid tiers where limits bite (Add SEO, scheduling or integration tools when a real gap appears.)
- If Scale: ActiveCampaign or HubSpot, plus Sales Navigator (ABM tools like 6sense or Demandbase once deal size justifies them.)
Note: At every stage, each tool earns its keep or gets cut.
The principle at every stage: each tool should either earn its keep or get cut. Most B2B teams that feel buried in software are paying for overlap, not capability.
### B2B vs B2C Software Differences
| Factor | B2B | B2C |
|--------|-----|-----|
| Sales cycle | Weeks to months | Minutes to days |
| Key tool | CRM + lead scoring | Product recommendations |
| Email frequency | Lower volume, higher relevance | Higher campaign volume, more promotional |
| Primary channel | Email + LinkedIn | Email + [SMS](/blog/sms-marketing-complete-guide/) |
| Automation focus | Lead nurturing | Purchase triggers |
| Content type | Whitepapers, case studies | Product, promotions |
### Getting Started
1. Start with **Brevo free plan** for email, CRM, and basic automation
2. Set up **Google Analytics** on your website
3. Build your first **[lead nurture sequence](/blog/email-sequence-guide/)**
4. Create a **content calendar** focused on your buyers' pain points
5. Add tools as you identify specific gaps in your workflow
The best B2B stack is not the most expensive one. It is the one where every tool is actively used and integrated with the others.
### Frequently asked questions
**What software do B2B marketers use?**
Most B2B teams need email and automation, a CRM, analytics, content and SEO tools, scheduling, integrations, and eventually prospecting or ABM software when account targeting becomes mature.
**How much does B2B marketing software cost?**
Cost depends on whether tools price by contacts, seats, send volume, credits, features, or enterprise contracts. Build a stack budget from active users, database size, workflow volume, and the revenue process each tool supports.
**What is the difference between B2B and B2C marketing software?**
B2B tools focus on lead scoring, longer nurture sequences, account-based marketing, and CRM integration. B2C tools prioritize high-volume sends, product recommendations, and purchase-triggered automation.
**Do I need a separate tool for every category?**
No. All-in-one platforms like Brevo and HubSpot collapse email, automation, and CRM into one system, which reduces both cost and integration work for smaller teams.
---
## B2C Email Marketing: Strategies for Consumer Engagement
Source: https://tajo.io/blog/b2c-email-marketing-guide/
Published: 2026-03-26 · Updated: 2026-05-10
Master B2C email marketing with proven strategies for consumer engagement. Learn segmentation, personalization, and campaign tactics that drive sales and loyalty.
Summary: B2C email marketing drives consumer engagement through personalization, segmentation, and emotional messaging. This guide covers strategies for welcome series, promotional campaigns, lifecycle automation, and measuring results.
B2C email marketing remains the highest-ROI channel for consumer brands, generating an average return of $36 for every dollar spent. Unlike social media where algorithms control your reach, email gives you direct access to your customers' inboxes -- a channel they check an average of 15 times per day.
But consumer expectations have shifted dramatically. Generic promotional blasts no longer cut through the noise. Today's B2C email marketing demands personalization, timing, and relevance that makes each recipient feel like the message was crafted specifically for them.
This guide covers the strategies, tactics, and workflows that drive B2C email marketing success in 2026.
### B2C Email Marketing Fundamentals
B2C email marketing targets individual consumers rather than business buyers. This fundamental difference shapes every aspect of your strategy, from messaging tone to send frequency.
#### What Makes B2C Email Unique
| Element | B2C Approach | B2B Approach |
|---------|-------------|-------------|
| Decision maker | Individual consumer | Committee or team |
| Sales cycle | Minutes to days | Weeks to months |
| Purchase trigger | Emotion, desire, urgency | Logic, ROI, business need |
| Content tone | Conversational, visual, fun | Professional, educational |
| Send frequency | 3-7 emails per week | 1-3 emails per week |
| Primary goal | Immediate conversion | Lead nurturing |
| Design emphasis | Visual, image-heavy | Content-driven |
#### The B2C Email Marketing Funnel
Consumer email marketing follows a distinct funnel that prioritizes speed and emotional connection:
**Awareness:** Capture email through lead magnets, pop-ups, or account creation
**Engagement:** Welcome series that establishes brand voice and value
**Conversion:** Promotional emails, abandoned cart recovery, and limited-time offers
**Retention:** Post-purchase sequences, loyalty programs, and personalized recommendations
**Advocacy:** Referral programs, review requests, and user-generated content
### Building Your B2C Email List
Your list quality directly determines your email marketing success. A smaller, engaged list outperforms a large, uninterested one every time.
#### High-Converting Signup Methods
**Website pop-ups and slide-ins:** Timed pop-ups offering 10-15% off a first purchase convert at 3-5% on average. Exit-intent pop-ups capture visitors about to leave.
**Embedded signup forms:** Place [signup forms](/blog/signup-form-guide/) in high-traffic areas: homepage hero, blog sidebar, footer, and product pages.
**Social media lead capture:** Instagram bio links, Facebook lead ads, and TikTok profile links drive social followers to your email list.
**Checkout opt-in:** Add an email marketing checkbox during purchase. Post-purchase subscribers have 4x higher lifetime value than cold subscribers.
**Gated content and quizzes:** Interactive quizzes ("Find your perfect product") collect emails while providing personalization data.
#### Maintaining List Health
Growing your list means nothing if it decays. Implement these practices:
- Use [double opt-in](/blog/double-opt-in-guide/) to verify subscribers
- Clean your list quarterly using an [email verification service](/blog/email-verification-service-guide/)
- Remove hard bounces immediately
- Suppress contacts with no engagement after 90 days
- Monitor [bounce rates](/blog/email-bounce-rate-guide/) and spam complaints
### Essential B2C Email Campaign Types
#### 1. Welcome Series
The [welcome email series](/blog/welcome-email-series-guide/) is your highest-performing automation. Welcome emails average 50-60% open rates -- double that of regular campaigns.
**Recommended 5-email welcome sequence:**
| Email | Timing | Content | Goal |
|-------|--------|---------|------|
| 1 | Immediate | Welcome, discount code, brand story | First purchase |
| 2 | Day 2 | Bestsellers and social proof | Product discovery |
| 3 | Day 4 | Brand values and community | Emotional connection |
| 4 | Day 7 | Personalized recommendations | Conversion |
| 5 | Day 10 | Discount reminder (if unused) | Urgency |
#### 2. Promotional Campaigns
Promotional emails drive the majority of B2C email revenue. The key is balancing frequency with value.
**Effective promotional email types:**
- Seasonal sales and holiday campaigns
- [Flash sales](/blog/flash-sale-guide/) with countdown timers
- New product launches and pre-orders
- Bundle offers and category promotions
- Member-exclusive or early-access events
**Best practices for [promotional emails](/blog/promotional-email-guide/):**
- Lead with the offer in the subject line
- Use a single, clear call-to-action
- Include product images with prices
- Add urgency through deadlines or limited stock
- Segment by purchase history and preferences
#### 3. Abandoned Cart Recovery
Cart abandonment emails recover 5-15% of lost revenue. A three-email sequence works best:
1. **1 hour after abandonment:** Reminder with cart contents and images
2. **24 hours:** Add social proof (reviews, ratings) and address objections
3. **48-72 hours:** Final reminder with incentive (free shipping or small discount)
Sequence, triggered by: Cart abandoned
1. Email 1: Reminder
2. Email 2: Social proof
3. Email 3: Final reminder
#### 4. Post-Purchase Emails
[Post-purchase emails](/blog/post-purchase-email-guide/) transform one-time buyers into repeat customers:
- [Order confirmation](/blog/order-confirmation-email-guide/) (immediate)
- Shipping notification with tracking
- Delivery follow-up with usage tips
- Review and rating request (7-14 days post-delivery)
- Cross-sell recommendations based on purchase (21-30 days)
Sequence, triggered by: Order placed
1. Order confirmation
2. Shipping notification
3. Delivery follow-up
4. Review and rating request
5. Cross-sell recommendations
Outcome: Repeat customer
#### 5. Lifecycle Automation
Lifecycle emails respond to where each customer is in their journey with your brand:
**New subscriber:** Welcome and education
**First-time buyer:** Onboarding and product guidance
**Repeat buyer:** Loyalty rewards and VIP treatment
**At-risk customer:** [Re-engagement campaigns](/blog/re-engagement-email-guide/) and win-back offers
**Loyal advocate:** Referral programs and exclusive previews
### B2C Email Personalization Strategies
Personalization is the difference between emails that convert and emails that get deleted. Modern B2C [email personalization](/blog/email-personalization-guide/) goes far beyond inserting a first name.
#### Data-Driven Personalization Layers
**Behavioral personalization:** Use browsing history, past purchases, and email engagement to tailor content. Show products related to what they have viewed or bought.
**Demographic personalization:** Adjust messaging based on location, age, gender, or other profile attributes. A winter coat promotion resonates differently in Miami than in Chicago.
**Purchase-based personalization:** Segment by purchase frequency, average order value, and product categories. High-value customers receive different offers than first-time buyers.
**Lifecycle personalization:** Match email content to the customer's stage. A subscriber who joined yesterday needs different messaging than a loyal customer of three years.
#### Personalization in Practice
| Data Point | Personalization Application | Impact |
|-----------|---------------------------|--------|
| Past purchases | Product recommendations | +29% revenue per email |
| Browse history | Abandoned browse emails | +15% conversion rate |
| Location | Local events and weather-based offers | +22% engagement |
| Purchase frequency | Replenishment reminders | +35% repeat purchases |
| Engagement level | Send frequency optimization | -40% unsubscribes |
| Birthday | [Birthday email campaigns](/blog/birthday-email-marketing-guide/) | +45% transaction rate |
### B2C Email Segmentation
[Email segmentation](/blog/email-segmentation-guide/) ensures each subscriber receives relevant content. B2C brands should segment across multiple dimensions.
#### Core B2C Segments
**By engagement level:**
- Highly engaged (opened 3+ emails in 30 days)
- Moderately engaged (opened 1-2 emails in 30 days)
- Disengaged (no opens in 60+ days)
- Inactive (no opens in 90+ days)
**By customer value:**
- VIP customers (top 10% by lifetime value)
- Regular customers (consistent but moderate spending)
- Discount-driven buyers (only purchase during sales)
- One-time purchasers (bought once, did not return)
**By purchase behavior:**
- Product category preferences
- Purchase frequency and recency
- Average order value
- Seasonal vs. year-round buyers
**By lifecycle stage:**
- Prospect (subscribed, never purchased)
- New customer (first purchase in last 30 days)
- Developing customer (2-3 purchases)
- Loyal customer (4+ purchases or 12+ months active)
- Lapsed customer (no purchase in 90+ days)
Platforms like Brevo make dynamic segmentation straightforward, automatically updating segments as customer data changes.
### B2C Email Design and Copywriting
#### Design Principles
B2C emails are visual-first. Consumer audiences scan rather than read, so your design must communicate value instantly.
**Mobile-first design:** Over 60% of B2C emails are opened on mobile devices. Design for small screens first, then adapt for desktop.
**Visual hierarchy:** Lead with your strongest image, follow with a headline, then supporting copy and CTA. Every email should have one primary action.
**Brand consistency:** Use consistent colors, fonts, and imagery across all emails. Subscribers should recognize your brand in their inbox instantly.
**Loading speed:** Optimize images and keep email file size under 100KB. Slow-loading emails lose readers before the content renders.
#### Copywriting for Consumer Audiences
B2C [email copywriting](/blog/email-copywriting-guide/) prioritizes emotion, brevity, and action:
- **Subject lines:** Keep under 50 characters. Use curiosity, urgency, or benefit-driven language. Test with [A/B testing](/blog/email-ab-testing-guide/) to find what resonates.
- **Preview text:** Complement the subject line with additional context. This is your second chance to earn the open.
- **Body copy:** Short paragraphs, bullet points, and scannable formatting. Get to the point quickly.
- **CTA buttons:** Action-oriented text ("Shop Now," "Get 20% Off," "Claim Your Gift"). Use contrasting colors and adequate padding for mobile tapping.
### Measuring B2C Email Marketing Performance
#### Key Metrics to Track
| Metric | B2C Benchmark | What It Tells You |
|--------|--------------|-------------------|
| Open rate | 20-25% | Subject line and sender effectiveness |
| Click-through rate | 2-4% | Content relevance and CTA strength |
| Conversion rate | 1-3% | Offer appeal and landing page alignment |
| Revenue per email | Varies by industry | Direct financial impact |
| Unsubscribe rate | Below 0.3% | Content-frequency balance |
| List growth rate | 2-5% monthly | Acquisition effectiveness |
| Customer lifetime value | Track over 12 months | Long-term email impact |
#### Revenue Attribution
Track email's contribution to overall revenue through:
- Direct attribution (purchases from email clicks)
- Assisted attribution (email touchpoints in conversion paths)
- Incrementality testing (comparing emailed vs. non-emailed groups)
- Cohort analysis (lifetime value of email-acquired customers vs. others)
For comprehensive tracking, read our guide on [email marketing analytics](/blog/email-marketing-analytics-guide/).
### B2C Email Marketing Tools and Platforms
Choosing the right [email marketing platform](/blog/best-email-marketing-providers/) is critical for B2C success. Look for these capabilities:
- Visual email builder with mobile preview
- Advanced segmentation and dynamic content
- Automation workflows with branching logic
- E-commerce integrations (product feeds, cart tracking)
- Real-time analytics and revenue attribution
- SMS and multi-channel capabilities
Brevo stands out for B2C marketers by combining email, SMS, WhatsApp, and CRM in a single platform with a generous free tier.
### Getting Started: Your B2C Email Marketing Checklist
1. **Set up your platform** with proper authentication ([SPF, DKIM, DMARC](/blog/spf-dkim-dmarc-guide/))
2. **Build your list** with optimized signup forms and lead magnets
3. **Create your welcome series** -- this is your highest-impact automation
4. **Design email templates** that are mobile-responsive and on-brand
5. **Set up abandoned cart recovery** to capture lost revenue immediately
6. **Segment your audience** by engagement, purchase behavior, and lifecycle stage
7. **Plan your promotional calendar** balancing sales emails with value-driven content
8. **Implement post-purchase automation** to drive repeat purchases
9. **Track metrics weekly** and optimize based on data
10. **Test continuously** -- subject lines, send times, offers, and design
B2C email marketing rewards brands that respect their customers' inboxes. Deliver value, stay relevant, and let data guide your decisions. The result is a direct revenue channel that no algorithm change can take away.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is B2C email marketing?**
B2C email marketing involves sending promotional, transactional, and relationship-building emails directly to individual consumers. It focuses on emotional triggers, personalized offers, and driving immediate purchases.
**How is B2C email marketing different from B2B?**
B2C emails target individual consumers with shorter sales cycles, emotional messaging, and promotional offers. B2B emails target business decision-makers with educational content and longer nurturing sequences.
**What is a good open rate for B2C emails?**
The average B2C email open rate is 20-25%, though top performers achieve 30% or higher. Rates vary by industry, with retail averaging 18-22% and media/entertainment reaching 25-30%.
---
## B2C Marketing Automation: Drive Sales with Smart Workflows
Source: https://tajo.io/blog/b2c-marketing-automation-guide/
Published: 2026-03-26 · Updated: 2026-05-17
Build B2C marketing automation workflows that drive sales and customer loyalty. Learn setup, campaign types, personalization tactics, and platform selection.
Summary: B2C marketing automation uses behavior-triggered workflows to engage consumers at scale. This guide covers essential workflows, personalization strategies, multi-channel automation, and choosing the right platform for consumer businesses.
B2C marketing automation is the engine behind the personalized shopping experiences that consumers now expect. When a customer abandons a cart, browses a product category, or reaches a loyalty milestone, automation ensures the right message reaches them at exactly the right moment -- across email, SMS, push notifications, and more.
The difference between brands that thrive and those that struggle often comes down to this: thriving brands automate the repetitive, high-impact touchpoints and focus their human effort on strategy and creativity. This guide shows you how to build B2C marketing automation that drives measurable sales growth.
### Why B2C Marketing Automation Matters
#### The Scale Problem
B2C businesses interact with thousands or millions of individual consumers. Manual marketing cannot deliver personalized experiences at this scale. Consider the math:
- 50,000 email subscribers across 8 lifecycle segments
- 5 behavioral triggers per segment
- 3 channels per touchpoint (email, SMS, push)
That is 1.2 million potential message combinations. No marketing team can manage this manually. Automation makes it possible.
#### The Revenue Impact
| Automation Type | Average Revenue Lift | Implementation Difficulty |
|----------------|---------------------|--------------------------|
| Abandoned cart recovery | 5-15% of lost revenue recovered | Easy |
| Welcome series | 320% more revenue than promotional emails | Easy |
| Browse abandonment | 3-8% conversion rate | Moderate |
| Post-purchase upsell | 10-20% increase in AOV | Moderate |
| Win-back campaigns | 5-12% reactivation rate | Moderate |
| Predictive recommendations | 15-30% higher click-through rates | Advanced |
### Essential B2C Marketing Automation Workflows
#### 1. Welcome Automation
Your [welcome email series](/blog/welcome-email-series-guide/) sets the tone for the entire customer relationship. Automated welcome sequences generate 3x more revenue per email than regular promotional sends.
**Recommended flow:**
- **Immediate:** Welcome email with incentive and brand introduction
- **Day 1:** Product discovery based on signup source or quiz responses
- **Day 3:** Social proof -- reviews, user-generated content, community
- **Day 5:** Personalized product recommendations
- **Day 7:** Incentive reminder with urgency (if not yet purchased)
**Key automation logic:**
- If subscriber purchases during sequence, exit and move to post-purchase flow
- If subscriber engages with specific category, branch to category-specific content
- If no engagement after email 3, try different subject line approach
Sequence, triggered by: New subscriber
1. Welcome
2. Product discovery
3. Social proof
4. Recommendations
5. Incentive reminder
#### 2. Abandoned Cart Recovery
The most immediately profitable automation for any e-commerce business. Set up a multi-step recovery sequence:
**Email 1 (1 hour):** Simple reminder with product images and a direct link back to cart
**SMS (4 hours):** Short text message with cart link (if SMS consent exists)
**Email 2 (24 hours):** Add customer reviews and urgency messaging
**Email 3 (48 hours):** Include a small incentive (free shipping or 5-10% off)
Sequence, triggered by: Cart abandoned
1. Email 1: Reminder
2. SMS: Cart link
3. Email 2: Reviews
4. Email 3: Incentive
When a customer adds items and leaves, the event triggers automatically in Brevo's [automation workflow builder](/blog/marketing-automation-workflow/), no manual setup required.
#### 3. Browse Abandonment
Capture shoppers who viewed products but did not add to cart:
- **Trigger:** Viewed product page 2+ times without adding to cart
- **Email:** "Still interested?" with the viewed product and related items
- **Timing:** 2-4 hours after browse session ends
- **Follow-up:** Category-level recommendations 24 hours later
#### 4. Post-Purchase Nurture
Transform buyers into repeat customers with automated [post-purchase sequences](/blog/post-purchase-email-guide/):
| Timing | Message | Channel |
|--------|---------|---------|
| Immediate | Order confirmation | Email |
| Shipping | Tracking notification | Email + SMS |
| Delivery +1 day | Product care/usage tips | Email |
| Delivery +7 days | Review request | Email |
| Delivery +14 days | Cross-sell recommendations | Email |
| Delivery +30 days | Replenishment reminder (if applicable) | Email + SMS |
#### 5. Customer Loyalty and VIP Automation
Identify your best customers and treat them accordingly:
**VIP triggers:**
- Reaches lifetime purchase threshold (e.g., 5th order or $500 total)
- Consistently high engagement scores
- Refers other customers
**VIP automation actions:**
- Send exclusive early access to new products
- Offer VIP-only discounts or free shipping
- Invite to loyalty program tiers
- Birthday and anniversary rewards
For a deeper look at [loyalty program strategies](/blog/customer-loyalty-program-guide/), see our dedicated guide.
#### 6. Win-Back Campaigns
Prevent customer churn with automated [re-engagement workflows](/blog/re-engagement-email-guide/):
- **Trigger:** No purchase in 60 days (adjust based on your typical purchase cycle)
- **Email 1:** "We miss you" with personalized bestsellers
- **Email 2 (Day 7):** Incentive offer (discount or free gift)
- **Email 3 (Day 14):** Feedback request -- why did they stop buying?
- **Final (Day 21):** Last chance offer before reducing send frequency
### Multi-Channel B2C Automation
Modern B2C automation extends beyond email. The most effective strategies coordinate messaging across every channel where consumers engage.
#### Channel Integration Strategy
| Channel | Best Used For | Automation Examples |
|---------|--------------|-------------------|
| Email | Detailed content, visuals, offers | Nurture sequences, promotions, newsletters |
| SMS | Urgent messages, order updates | Cart recovery, flash sales, delivery alerts |
| Push notifications | Real-time engagement | Price drops, back-in-stock, location-based |
| WhatsApp | Conversational commerce | Order updates, support, product discovery |
| In-app messages | Active user engagement | Onboarding, feature announcements |
#### Orchestrating Across Channels
The key to [multi-channel marketing](/blog/multi-channel-marketing/) automation is coordination, not duplication. Do not send the same message on every channel simultaneously. Instead:
1. **Define channel priority per message type:** Cart recovery might start with email, escalate to SMS, then push notification.
2. **Set channel frequency caps:** Limit total messages per customer per day across all channels.
3. **Use channel preference data:** If a customer consistently engages via SMS but ignores email, adjust your channel mix.
4. **Deduplicate messaging:** If a customer converts after the email, cancel the scheduled SMS follow-up.
Brevo's multi-channel automation builder handles this orchestration natively, allowing you to build workflows that span email, SMS, and [WhatsApp](/blog/whatsapp-marketing-guide/) from a single interface.
### Personalization in B2C Automation
#### Dynamic Content Blocks
Use customer data to swap content blocks within automated emails:
- **Product recommendations:** Based on browse and purchase history
- **Location-specific content:** Local store information, weather-based suggestions
- **Loyalty tier messaging:** Different offers for different customer value levels
- **Category affinity:** Feature products from their preferred categories
#### Predictive Automation
Advanced B2C automation uses predictive models to anticipate customer needs:
- **Predicted next purchase date:** Send reminders before customers typically reorder
- **Churn prediction:** Trigger win-back campaigns before customers fully disengage
- **Lifetime value prediction:** Identify high-potential customers early and invest in their experience
- **Product affinity modeling:** Recommend products based on similar customer behavior
### Choosing a B2C Marketing Automation Platform
#### Platform Comparison
| Feature | Brevo | Klaviyo | Omnisend | Mailchimp |
|---------|-------|---------|----------|-----------|
| Email automation | Advanced | Advanced | Advanced | Moderate |
| SMS automation | Built-in | Built-in | Built-in | Add-on |
| WhatsApp | Built-in | Limited | No | No |
| CRM included | Yes | No | No | Basic |
| E-commerce integrations | Extensive | Shopify-focused | Multi-platform | Moderate |
| Free tier | 300 emails/day | 250 contacts | 250 contacts | 500 contacts |
| Best for | Multi-channel B2C | Shopify brands | E-commerce | General marketing |
For detailed platform comparisons, see our guides on [Brevo vs. Klaviyo](/blog/brevo-vs-klaviyo/), [Brevo vs. Omnisend](/blog/brevo-vs-omnisend/), and [Brevo vs. Mailchimp](/blog/brevo-vs-mailchimp/).
#### What to Prioritize
**For e-commerce brands:** Product catalog integration, abandoned cart triggers, and revenue attribution are essential.
**For subscription businesses:** Lifecycle stage management, churn prediction, and renewal automation matter most.
**For multi-location retail:** Location-based targeting, in-store event promotion, and omnichannel coordination are priorities.
Decision: What kind of B2C business are you?
- If E-commerce brand: Catalog, cart triggers, attribution (Product catalog integration, abandoned cart triggers and revenue attribution are essential.)
- If Subscription business: Lifecycle, churn, renewal (Lifecycle stage management, churn prediction and renewal automation matter most.)
- If Multi-location retail: Location and omnichannel (Location-based targeting, in-store event promotion and omnichannel coordination.)
### Implementation Roadmap
#### Month 1: Foundation
- Set up platform and connect data sources
- Import and clean customer data
- Build welcome series and abandoned cart recovery
- Configure basic segmentation
#### Month 2: Expansion
- Launch post-purchase automation
- Add browse abandonment workflow
- Implement basic personalization (name, product recommendations)
- Set up [A/B testing](/blog/email-ab-testing-guide/) on subject lines and send times
#### Month 3: Optimization
- Launch win-back and re-engagement campaigns
- Add SMS to key automation workflows
- Implement dynamic content blocks
- Build VIP and loyalty automation
#### Month 4+: Advanced
- Develop predictive automation models
- Optimize cross-channel orchestration
- Build seasonal and event-based automation calendars
- Refine segmentation based on performance data
### Measuring B2C Automation Performance
Track these metrics to evaluate and optimize your automation:
| Metric | Benchmark | Action If Below |
|--------|-----------|----------------|
| Automation revenue share | 20-40% of total email revenue | Add more workflow types |
| Cart recovery rate | 5-15% of abandoned carts | Test timing and incentives |
| Welcome series conversion | 3-8% | Optimize offer and sequence length |
| Repeat purchase rate | 25-40% | Strengthen post-purchase automation |
| Unsubscribe rate per workflow | Below 0.5% | Reduce frequency or improve relevance |
| SMS opt-in rate | 5-15% of email subscribers | Test opt-in incentives |
### Start Driving Automated Revenue
B2C marketing automation is not optional for consumer brands that want to compete effectively. The workflows described in this guide -- welcome series, cart recovery, post-purchase nurture, and win-back campaigns -- represent the minimum viable automation stack that every B2C business should have running.
Begin with the highest-revenue workflows (welcome and abandoned cart), prove the ROI, and expand systematically. The only barrier is waiting too long to begin.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is B2C marketing automation?**
B2C marketing automation uses software to automatically send targeted messages to consumers based on their behavior, preferences, and lifecycle stage. It includes email sequences, SMS campaigns, push notifications, and personalized product recommendations.
**How does B2C marketing automation differ from B2B?**
B2C automation focuses on high-volume, behavior-triggered campaigns with shorter conversion windows. B2B automation emphasizes lead scoring, multi-stakeholder nurturing, and longer sales cycles. B2C typically involves more channels and higher send frequencies.
**What ROI can I expect from B2C marketing automation?**
B2C companies implementing marketing automation see an average 14.5% increase in sales productivity, 12.2% reduction in marketing overhead, and 451% increase in qualified leads. Revenue from automated campaigns typically grows 10-25% within the first six months.
---
## ActiveCampaign Replacement Matrix: Automation, CRM, Ecommerce, Pricing Models, and Fit (2026)
Source: https://tajo.io/blog/best-activecampaign-alternatives/
Published: 2026-03-01 · Updated: 2026-05-04
Compare ActiveCampaign replacements by automation depth, CRM fit, ecommerce data, multichannel support, pricing model, and migration work.
Summary: Choose an ActiveCampaign replacement by matching the reason you are leaving: automation complexity, CRM needs, ecommerce data, channel coverage, or contact-based pricing. Model total cost at your expected list size before switching.
ActiveCampaign is one of the most capable marketing automation platforms on the market. Its automation builder is genuinely excellent, and for teams that live inside complex multi-branch workflows, it earns its reputation. But capability is not the same as fit. As your contact list grows, ActiveCampaign's contact-based pricing climbs fast, and plenty of businesses end up paying for depth they never use.
If you have reached that point, you have options. This guide compares nine strong ActiveCampaign alternatives in 2026, with honest notes on where each one wins and where it falls short. Pricing moves often, so treat the numbers below as recent reference points and confirm current rates on each vendor's site before you commit.
### Quick comparison
| Platform | Best for | Pricing model to verify | Key advantage |
|----------|----------|-------------------------|---------------|
| **Brevo** | Multichannel value | Send-volume tiers | Pricing tied to sends, not contacts |
| **HubSpot** | All-in-one CRM | Hub, contact, and seat tiers | Complete marketing-plus-sales suite |
| **Mailchimp** | Brand familiarity | Contact tiers and send limits | Easy to learn |
| **GetResponse** | Marketing plus webinars | Contact and feature tiers | Built-in webinar hosting |
| **MailerLite** | Budget automation | Subscriber tiers | Clean, simple interface |
| **Drip** | Ecommerce lifecycle | Contact tiers | Behavior-based revenue focus |
| **Klaviyo** | Shopify stores | Profile and message tiers | Deep ecommerce data model |
| **Omnisend** | Ecommerce automation | Contact and message tiers | Pre-built store workflows |
| **Kit (ConvertKit)** | Creators | Subscriber tiers | Audience monetization tools |
### Why consider ActiveCampaign alternatives?
ActiveCampaign is strong, but the common reasons people start shopping around are consistent:
- **Cost scales with contacts.** Pricing is tied to how many contacts you store, so a list that grows but does not send more email still pushes you into higher tiers.
- **The good stuff lives on higher tiers.** Predictive sending, advanced reporting, and stronger CRM features tend to sit on Professional and above, which can mean a real jump in spend.
- **Limited native SMS reach.** SMS is concentrated in North America rather than offered evenly worldwide, which is a gap if you market internationally.
- **No native WhatsApp.** A critical channel in many markets is missing without third-party tools.
- **No built-in loyalty.** Repeat-purchase and points programs require add-ons or integrations.
- **Overkill for simple needs.** If you mostly send newsletters and a welcome series, the depth becomes overhead.
### ActiveCampaign Alternatives by Fit
#### 1. Brevo (formerly Sendinblue)
Brevo is the alternative many ActiveCampaign users compare first because it changes the pricing math. Instead of charging primarily by the number of contacts you store, Brevo's paid plans are built around how many emails you send. For a business sitting on a large but lightly mailed list, that difference is the whole game.
**Key features:**
- Visual automation builder with conditional logic and split testing
- Contacts not the billing lever, with a generous storage ceiling
- Email, SMS across 200+ countries, and WhatsApp campaigns
- Transactional email and SMS via API
- Built-in CRM, landing pages, and signup forms
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**ActiveCampaign vs Brevo:**
| Feature | ActiveCampaign | Brevo |
|---------|----------------|-------|
| Email automation | Excellent | Very good |
| SMS coverage | Mainly North America | 200+ countries |
| WhatsApp | No | Yes |
| CRM | Built-in | Built-in |
| Billing model | Per contact | Per send |
| Free plan | No | Yes |
**Honest cons:** ActiveCampaign's automation logic is still deeper for the most intricate branching scenarios, and Brevo's daily send cap on the free tier can feel limiting once you grow.
**Best for:** Businesses that want capable automation and true multichannel reach without paying for every contact they store.
#### 2. HubSpot Marketing Hub
HubSpot wraps marketing automation inside a full CRM, sales, and service suite. If you want one system of record for the entire customer journey, few platforms match its breadth.
**Key features:** Free CRM, marketing automation, landing pages, blog and SEO tools, social management, and a connected sales pipeline.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** The jump from Starter to Professional is large, and costs can balloon as you add seats and contacts. See our [HubSpot alternatives](/blog/hubspot-alternatives/) for the full picture.
**Best for:** Growing B2B teams that want marketing and sales in one place and can budget for the higher tiers.
#### 3. Mailchimp
Mailchimp remains the most recognizable name in email and the easiest on-ramp for beginners. Its automation is simpler than ActiveCampaign's, which is the point.
**Key features:** Intuitive builder, customer journeys, landing pages, a basic website builder, and AI content assists.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Pricing climbs with both contacts and features, and advanced automation lags dedicated tools. See our [Mailchimp alternatives](/blog/best-mailchimp-alternatives/).
**Best for:** Teams that value ease of use and brand familiarity over automation depth.
#### 4. GetResponse
GetResponse stands out by bundling webinar hosting and conversion funnels with email marketing, which is rare in this category.
**Key features:** Email marketing, webinars, conversion funnels, landing pages, automation, and ecommerce tools.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** No WhatsApp, and the automation builder is solid rather than best in class.
**Best for:** Businesses that run webinars as a regular part of their funnel.
#### 5. MailerLite
MailerLite delivers clean, modern automation at budget-friendly prices, with one of the better free tiers in the market.
**Key features:** Visual automation, drag-and-drop editor, website builder, pop-ups and forms, A/B testing.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Automation and reporting are lighter than ActiveCampaign, and there is no WhatsApp.
**Best for:** Small businesses that want simplicity without sacrificing modern design.
#### 6. Drip
Drip is purpose-built for ecommerce lifecycle marketing, with strong behavior tracking and revenue attribution.
**Key features:** Ecommerce CRM, visual workflows, behavior-based triggers, revenue reporting, email plus SMS, Shopify and WooCommerce integrations.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Contact-based pricing means it is not the cheapest as you grow, and it is narrower than a general-purpose suite.
**Best for:** Ecommerce brands that want deep behavioral segmentation.
#### 7. Klaviyo
Klaviyo is the ecommerce specialist many Shopify stores default to, thanks to its rich data model and predictive analytics.
**Key features:** Native ecommerce integrations, predictive analytics, product recommendations, SMS, lifecycle flows, revenue tracking.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Among the most expensive options at scale, and overkill for non-ecommerce use.
**Best for:** Shopify and WooCommerce stores that want best-in-class ecommerce data and can absorb premium pricing.
#### 8. Omnisend
Omnisend ships pre-built ecommerce automations that work almost out of the box, which shortens setup time considerably.
**Key features:** Ready-made store workflows, email plus SMS plus push, product picker, in-email discount codes, Shopify integration.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Less flexible for non-ecommerce use cases, and no WhatsApp.
**Best for:** Stores that want proven automation templates fast.
#### 9. Kit (formerly ConvertKit)
Kit is built for creators, newsletter writers, and digital product sellers rather than complex B2B funnels.
**Key features:** Visual automation, digital product and newsletter monetization, landing pages, simple tagging, paid recommendations.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Light on ecommerce and multichannel, with no WhatsApp or built-in SMS depth.
**Best for:** Content creators and course sellers building an audience.
### Feature comparison
#### Automation and CRM
| Feature | ActiveCampaign | Brevo | HubSpot | Drip |
|---------|----------------|-------|---------|------|
| Visual builder | Yes | Yes | Yes | Yes |
| Conditional logic | Advanced | Good | Good | Good |
| Split testing | Yes | Yes | Yes | Yes |
| Predictive sending | Yes (higher tiers) | Yes | Yes | No |
| Lead scoring | Yes | Yes | Yes | Yes |
| Built-in CRM | Yes | Yes | Yes | Basic |
#### Channel coverage
| Channel | ActiveCampaign | Brevo | Omnisend | Klaviyo |
|---------|----------------|-------|----------|---------|
| Email | Yes | Yes | Yes | Yes |
| SMS | Mainly North America | 200+ countries | Select markets | Select markets |
| WhatsApp | No | Yes | No | No |
| Push | No | Yes | Yes | No |
| Live chat | Yes | Yes | No | No |
### How to pick the right alternative
Start from your actual constraints rather than a feature checklist.
**If pricing is the trigger:** Brevo's send-based model and MailerLite's low tiers are the clearest wins, especially for large lists you mail occasionally.
**If you need depth:** ActiveCampaign itself or HubSpot Professional remain the most powerful, so the question is whether the spend is justified.
**If you market internationally:** Brevo's 200+ country SMS and WhatsApp give it a clear edge over ActiveCampaign's narrower reach.
**If you are a creator:** Kit is built for you.
Decision: What is pushing you off ActiveCampaign?
- If Pricing: Brevo or MailerLite (Send-based pricing or low tiers, for large lists mailed occasionally.)
- If You need more depth: ActiveCampaign or HubSpot Professional (Still the most powerful; the question is whether the spend is justified.)
- If You run a store: Brevo, Klaviyo or Omnisend (The ecommerce-ready picks.)
- If International SMS or WhatsApp: Brevo (SMS in 200+ countries plus WhatsApp.)
- If You are a creator: Kit (Built for creators and course sellers.)
A practical exercise: list the three automations and channels you genuinely use today, then price each platform at your real contact and send volume. The cheapest sticker price is rarely the cheapest at scale, and the most powerful tool is wasted if half its features sit idle.
### Migration from ActiveCampaign
Switching platforms is mostly about preparation, not technical difficulty. Most moves take a few days.
**Before you switch:**
1. Document every automation. Screenshot workflows, note triggers and conditions, and list integrations.
2. Export your data: contacts with custom fields, tags, and segments, plus campaign history if you need it.
3. Identify the automations that cannot break, usually the welcome series, lead nurture, and onboarding.
**Migration steps:**
1. Set up the new account and authenticate your sending domain.
2. Import contacts and recreate custom fields.
3. Rebuild your critical automations first.
4. Test thoroughly with internal addresses across devices.
5. Run both platforms in parallel briefly, then cut over once confirmed.
Sequence, triggered by: Leaving ActiveCampaign
1. Prepare
2. Set up the new account
3. Import contacts
4. Rebuild critical automations first
5. Test
6. Run both in parallel
Outcome: Cut over once deliverability is confirmed
**Common pitfalls:** forgetting to recreate tags and segments, missing a trigger, skipping cross-device testing, and rushing the cutover before deliverability is confirmed.
### Conclusion
ActiveCampaign is a genuinely strong platform, and for teams that need its automation depth it is hard to beat. But for the many businesses paying premium contact-based prices for features they do not use, the alternatives above offer real relief.
- **Best overall alternative:** Brevo, for capable automation, true multichannel reach, and pricing tied to sends rather than contacts.
- **Best all-in-one:** HubSpot, if you want marketing and sales in one suite and can budget for it.
- **Best for simplicity:** MailerLite, for clean, affordable automation.
Ready to make the switch?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What are the best ActiveCampaign alternatives?**
Strong ActiveCampaign alternatives include Brevo for multichannel marketing and send-based pricing, HubSpot for CRM-led teams, Klaviyo for ecommerce, MailerLite for simple email, and Kit for creators.
**Why switch from ActiveCampaign?**
Teams usually compare alternatives when contact-based pricing, workflow complexity, CRM needs, ecommerce data, or channel coverage no longer match how they actually market.
**Is Brevo a good ActiveCampaign alternative?**
Yes. Brevo is a strong fit when you want email, SMS, WhatsApp, CRM, and automation in one account with pricing tied primarily to send volume instead of stored contacts.
---
## Constant Contact Alternatives: Email, Automation, Pricing Models, Events, and Migration Fit (2026)
Source: https://tajo.io/blog/best-constant-contact-alternatives/
Published: 2026-03-01 · Updated: 2026-05-03
Compare Constant Contact alternatives by email automation, event support, multichannel reach, pricing model, ease of use, and migration work.
Summary: Constant Contact is still useful for simple email and support-led small businesses, but alternatives may fit better when you need deeper automation, send-volume pricing, SMS, WhatsApp, ecommerce data, or a connected CRM.
Constant Contact has been a dependable email marketing tool for small businesses for two decades. Its phone support is genuinely good, it is approachable for non-technical users, and event-driven businesses lean on its tools. But the platform's automation is light by 2026 standards, it is email-only with no native SMS or WhatsApp, and its contact-based pricing rises faster than many small businesses expect. There is also no free plan, only a trial.
If you have outgrown it or just want more for your money, the alternatives below cover ten strong options. Pricing changes regularly, so use the figures here as recent reference points and verify current rates on each vendor's site before switching.
### Quick comparison
| Platform | Best for | Pricing model to verify | Key advantage |
|----------|----------|-------------------------|---------------|
| **Brevo** | Multichannel value | Send-volume tiers | Pricing tied to sends, not contacts |
| **Mailchimp** | Brand familiarity | Contact tiers and send limits | Easy interface |
| **MailerLite** | Budget-conscious | Subscriber tiers | Clean design |
| **GetResponse** | All-in-one marketing | Contact and feature tiers | Webinar hosting |
| **AWeber** | Beginners | Subscriber tiers | Strong support |
| **ActiveCampaign** | Advanced automation | Contact tiers | Powerful workflows |
| **Moosend** | Simple automation | Subscriber tiers | Lower-cost automation |
| **HubSpot** | Growing businesses | Hub, contact, and seat tiers | Complete platform |
| **Kit (ConvertKit)** | Creators | Subscriber tiers | Audience monetization |
| **Campaign Monitor** | Design teams | Contact and send tiers | Polished templates |
### Why switch from Constant Contact?
The recurring reasons businesses move on:
- **Pricing rises with your list.** Contact-based tiers, plan gates, and add-ons can push costs up steadily as you grow.
- **Automation is basic.** Compared with modern visual workflow builders, Constant Contact's automation feels limited for anything beyond a welcome series.
- **Email only.** No native SMS, WhatsApp, or push, so reaching customers on other channels means bolting on separate tools.
- **Reporting is thin.** Analytics cover the essentials but lag platforms built for data-driven marketers.
- **Interface shows its age.** It is usable, but newer tools feel faster and more intuitive.
That said, Constant Contact still does some things well: live phone support, simple event and survey tools, and a low barrier to entry for first-time email marketers. The right alternative depends on which of those you actually rely on.
### Constant Contact Alternatives by Fit
#### 1. Brevo (formerly Sendinblue)
Brevo is a natural upgrade for many Constant Contact users because it fixes two common pain points at once: it adds real multichannel reach and it changes how you pay. Rather than billing primarily by contacts stored, Brevo's paid plans are built around how many emails you send. For a small business with a slowly growing list, that can mean more room to grow.
**Key features:**
- Email marketing with a visual automation builder
- Contacts not the billing lever, with a high storage ceiling
- SMS across 200+ countries and WhatsApp campaigns
- Transactional email and SMS via API
- Built-in CRM, landing pages, and signup forms
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Brevo vs Constant Contact:**
| Feature | Constant Contact | Brevo |
|---------|------------------|-------|
| Free plan | No | Yes |
| SMS marketing | No | Yes (200+ countries) |
| WhatsApp | No | Yes |
| Automation | Basic | Advanced |
| Billing model | Per contact | Per send |
| Phone support | Yes | Limited on lower tiers |
**Honest cons:** Constant Contact's live phone support is more hands-on, especially on entry plans, and Brevo's free-tier daily send cap can pinch as you scale.
**Best for:** Small businesses that want modern multichannel marketing without paying per contact.
#### 2. Mailchimp
Mailchimp is the most recognizable email platform and an easy switch for users who want a familiar, polished experience.
**Key features:** Friendly builder, customer journeys, landing pages, a basic website builder, social posting, and AI content tools.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Costs climb with both contacts and features, and no WhatsApp. See our [Mailchimp alternatives](/blog/best-mailchimp-alternatives/).
**Best for:** Teams that prioritize ease of use and brand familiarity.
#### 3. MailerLite
MailerLite pairs clean, modern design with one of the better free tiers around, making it a popular budget upgrade.
**Key features:** Drag-and-drop editor, automation, website builder, pop-ups and forms, A/B testing, ecommerce integrations.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Email-focused, with no native SMS or WhatsApp.
**Best for:** Small businesses and startups that want simplicity at a low price.
#### 4. GetResponse
GetResponse bundles webinar hosting and conversion funnels with email marketing, which is unusual in this category.
**Key features:** Email, webinars, conversion funnels, landing pages, automation, ecommerce tools.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** No WhatsApp, and the automation is capable rather than leading.
**Best for:** Businesses that run webinars regularly.
#### 5. AWeber
AWeber is a close spiritual match to Constant Contact: straightforward, beginner-friendly, with strong human support.
**Key features:** Templates, drag-and-drop builder, automation, landing pages, web push, responsive support.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Automation and segmentation are lighter than modern platforms.
**Best for:** Beginners who value support and simplicity over depth.
#### 6. ActiveCampaign
ActiveCampaign is the step up for businesses that have outgrown basic email and want serious automation and CRM.
**Key features:** Advanced visual automation, built-in CRM, site tracking, lead scoring, sales automation, a large integration ecosystem.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** A steeper learning curve and contact-based pricing that climbs fast.
**Best for:** Businesses ready to invest in sophisticated workflows.
#### 7. Moosend
Moosend offers solid automation at one of the lowest entry prices in the market.
**Key features:** Email campaigns, automation, landing pages, forms and pop-ups, real-time analytics.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Smaller ecosystem and fewer integrations than the big names.
**Best for:** Budget-conscious teams that still want automation.
#### 8. HubSpot
HubSpot delivers email as part of a full CRM, sales, and service suite, ideal if you want one system of record.
**Key features:** Free CRM, email marketing, landing pages, forms, live chat, sales pipeline.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Gets expensive fast beyond the entry tier.
**Best for:** Growing businesses that want marketing and sales unified.
#### 9. Kit (formerly ConvertKit)
Kit is purpose-built for creators, newsletter writers, and digital product sellers rather than traditional small-business email.
**Key features:** Visual automation, digital product and newsletter monetization, landing pages, simple tagging, paid recommendations.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Light on multichannel and ecommerce.
**Best for:** Creators and course sellers building an audience.
#### 10. Campaign Monitor
Campaign Monitor leans into beautiful, on-brand email design with a polished template library.
**Key features:** Designer templates, drag-and-drop builder, link review, visual journey builder, analytics, transactional email.
**Pricing model:** Verify current tiers, feature gates, send or contact limits, and add-on costs on the vendor pricing page before buying.
**Honest cons:** Pricing is contact-based and automation is lighter than dedicated tools.
**Best for:** Design-focused teams and agencies managing multiple brands.
### Feature comparison
#### Email and automation
| Feature | Constant Contact | Brevo | ActiveCampaign |
|---------|------------------|-------|----------------|
| Drag-and-drop editor | Yes | Yes | Yes |
| Visual automation | Basic | Yes | Advanced |
| Triggers | Limited | Many | Many |
| Segmentation | Basic | Advanced | Advanced |
| A/B testing in flows | No | Yes | Yes |
#### Channel coverage
| Channel | Constant Contact | Brevo | GetResponse |
|---------|------------------|-------|-------------|
| Email | Yes | Yes | Yes |
| SMS | No | 200+ countries | Select markets |
| WhatsApp | No | Yes | No |
| Push | No | Yes | Yes |
| Live chat | No | Yes | Yes |
### How to pick the right alternative
Match the tool to what you actually use Constant Contact for today.
**If you mostly send newsletters and a welcome series:** MailerLite or Brevo's free and Starter tiers will likely cost less and do more.
**If you want to add channels:** Brevo's SMS and WhatsApp reach is the standout, with everything in one platform.
**If you need real automation:** ActiveCampaign or HubSpot are the depth picks, accepting higher cost and a learning curve.
**If support is non-negotiable:** AWeber is the closest match to Constant Contact's hands-on service.
Decision: What do you use Constant Contact for today?
- If Newsletters and a welcome series: MailerLite or Brevo free and Starter tiers (Likely to cost less and do more.)
- If You want to add channels: Brevo (SMS and WhatsApp reach in one platform.)
- If You need real automation: ActiveCampaign or HubSpot (The depth picks, at a higher cost and a learning curve.)
- If Support is non-negotiable: AWeber (The closest match to Constant Contact's hands-on service.)
- If You run a store: Brevo (Shopify sync, abandoned-cart recovery and loyalty programs.)
Before committing, price your top two choices at your real contact count and send volume, and test migration with a small segment. Most platforms offer a free trial, so use it.
### Migration from Constant Contact
Most migrations take one to three days with a little planning.
**Before switching:**
1. Export your data: all contacts, template designs, and a record of your automations.
2. Document integrations: connected apps, API usage, and embedded forms.
3. Choose timing: ideally end of billing cycle and a quiet campaign period, with room to test.
**Migration steps:**
1. Create the new account and authenticate your sending domain.
2. Import contacts with tags and segments.
3. Recreate key templates and automations.
4. Update signup forms and embeds.
5. Test deliverability with internal addresses.
6. Move production over once confirmed.
Sequence, triggered by: Leaving Constant Contact
1. Prepare
2. Create the new account
3. Import contacts
4. Recreate key templates and automations
5. Update signup forms and embeds
6. Test deliverability
Outcome: Move production over once confirmed
**Tips:** run both platforms briefly, start with non-critical campaigns, watch deliverability closely in the first weeks, and update form embeds only after testing.
### Conclusion
Constant Contact still suits beginners who value phone support and simple tools, but most businesses will get more features, better automation, and lower costs by switching.
- **Best overall:** Brevo, for multichannel reach and pricing tied to sends rather than contacts.
- **Best for beginners:** MailerLite or AWeber, for simplicity and support.
- **Best for automation:** ActiveCampaign, for sophisticated workflows.
- **Best for budget:** Moosend, for the lowest entry price.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**How do I choose the right alternative?**
Start with why Constant Contact no longer fits: automation depth, pricing model, event tools, SMS or WhatsApp, ecommerce data, support needs, or CRM integration. Then compare only platforms that solve that specific gap.
**Is it hard to switch email marketing platforms?**
The work is manageable if you export contacts, tags, unsubscribes, forms, templates, and automations; rebuild domain authentication; and run one parallel send before shutting Constant Contact off.
**Should I choose a cheaper alternative?**
Choose a cheaper platform only if it still covers the workflows you rely on. A lower email bill can disappear if you need separate tools for automation, SMS, CRM, ecommerce data, or loyalty.
---
## Email Marketing Provider Comparison: Pricing Models, Automation, Ecommerce, and Channel Fit (2026)
Source: https://tajo.io/blog/best-email-marketing-providers/
Published: 2026-03-08 · Updated: 2026-05-25
Compare email marketing providers by pricing model, automation depth, ecommerce data, SMS and WhatsApp support, free-plan limits, and team fit.
Summary: Pick an email marketing provider by pricing model, channel mix, automation depth, ecommerce data, and migration risk. The right answer is different for Shopify stores, creators, B2B teams, and simple newsletter programs.
The email marketing platform you choose shapes your costs for years. The wrong one quietly inflates your bill as your list grows, caps your deliverability, or forces you to bolt on a second tool for SMS. The right one scales with you and keeps revenue per send climbing.
The platform underneath email matters because pricing model, deliverability controls, automation depth, and channel support shape the economics for years. Below are the providers worth shortlisting in 2026, organized by use case and the trade-offs that actually bite when you commit. Pricing changes often, so confirm current rates before you sign up.
### How we ranked them
We weighed five things: deliverability and sender reputation tools, the pricing model and how it scales, automation depth, multi-channel reach (SMS, WhatsApp, push), and ease of use for a small team. A platform that is cheap at signup but punishing at the next growth stage does not win here.
### Quick comparison
| Provider | Best for | Pricing model to verify | Watch before choosing |
|----------|----------|-------------------------|-----------------------|
| Brevo | Value and multi-channel | Send-volume tiers | Daily/monthly send caps and feature gates |
| Klaviyo | Ecommerce | Profile and message tiers | Cost at active profile count |
| Mailchimp | Beginners | Contact tiers and send limits | Contact counting rules and automation gates |
| ActiveCampaign | Automation | Contact tiers | CRM and advanced feature tiers |
| MailerLite | Tight budgets | Subscriber tiers | Subscriber caps and approval requirements |
| Kit | Creators | Subscriber tiers | Creator feature and commerce limits |
| Omnisend | Ecommerce omnichannel | Contact and message tiers | SMS credits and ecommerce-only fit |
| GetResponse | Webinars + email | Contact and feature tiers | Webinar and funnel feature gates |
| HubSpot | Full marketing suite | Hub, contact, and seat tiers | Professional-tier jump for serious automation |
### Email Marketing Providers by Fit
#### 1. Brevo
Best for value and multi-channel marketing.
Brevo (formerly Sendinblue) is the standout on price because it bills by emails sent, not contacts stored. You can keep an unlimited list and only pay when you send, which flips the economics for businesses with large but occasionally engaged audiences. It also bundles email, SMS, and WhatsApp into one automation builder, plus a free CRM and transactional email, so you rarely need a second tool.
Brevo's pricing is built around send volume rather than stored contacts. Check the current send tiers, branding rules, automation gates, and add-ons such as dedicated IP before modeling the full setup.
Pros: per-email pricing, native SMS and WhatsApp, free CRM, strong transactional delivery. Cons: the interface is less glossy than Mailchimp, and the cheapest tiers cap automation features.
#### 2. Klaviyo
Best for ecommerce.
Klaviyo is purpose-built for online stores, with deep Shopify and WooCommerce integrations, predictive analytics, and revenue attribution that ties each flow to dollars. Pre-built flows for abandoned cart, browse abandonment, and post-purchase are best in class.
Klaviyo's plans scale by profiles and message usage. Model cost at your active profile count after suppressions, and include SMS separately if text messaging is part of the lifecycle plan.
Pros: deepest ecommerce data model, excellent attribution, mature flows. Cons: expensive as your list grows, overkill for non-ecommerce businesses.
#### 3. Mailchimp
Best for beginners.
Mailchimp remains the most recognisable name and the friendliest on-ramp. The drag-and-drop editor, generative design assistant, and large template library make a first campaign painless. It now bundles a website builder and light CRM.
Mailchimp uses contact-based pricing with plan gates for automation, testing, support, and advanced features. Confirm how contacts are counted and whether SMS availability fits your market.
Pros: easiest interface, strong templates, good brand recognition. Cons: contact-based pricing gets expensive fast, counts some unsubscribed contacts, limited multi-channel.
#### 4. ActiveCampaign
Best for automation.
ActiveCampaign has the most powerful automation in the mid-market: deep conditional branching, predictive sending, lead scoring, and a built-in CRM that suits sales-led teams. If your growth depends on intricate nurture logic, this is the engine.
ActiveCampaign pricing scales by contacts and feature tier. Confirm where CRM, landing pages, reporting, and predictive features sit before treating the entry plan as representative.
Pros: best-in-class automation, solid CRM, strong B2B fit. Cons: steeper learning curve, no free tier, reporting could be cleaner.
#### 5. MailerLite
Best for tight budgets that still want modern features.
MailerLite pairs a clean, modern editor with one of the better free tiers and low entry pricing. It covers automation, landing pages, websites, and even selling digital products without feeling bloated.
MailerLite uses subscriber tiers and approval rules. Check the current subscriber caps, send limits, automation access, and support level before migrating.
Pros: excellent value, clean interface, generous free tier. Cons: strict onboarding review, limited SMS, smaller integration ecosystem.
#### 6. Kit (formerly ConvertKit)
Best for creators.
Kit is built for newsletter writers, course sellers, and creators. Tag-based subscriber management, simple visual automations, and built-in commerce and sponsorship tools suit content-first audiences who value personal-feeling email over heavy design.
Kit pricing scales by subscriber count and creator feature tier. Check the current limits for automations, paid products, newsletter recommendations, and advanced reporting.
Pros: ideal for creators, generous free tier, monetisation built in. Cons: limited templates, basic analytics, no real multi-channel.
#### 7. Omnisend
Best for ecommerce teams that want omnichannel without Klaviyo pricing.
Omnisend focuses entirely on ecommerce and bundles email, SMS, and push into pre-built workflows for cart recovery, welcome, and re-engagement. It is a strong middle ground between Mailchimp and Klaviyo.
Omnisend pricing depends on contact count, message volume, and SMS credits. It works best when ecommerce automation is the main reason for the platform.
Pros: omnichannel out of the box, good Shopify integration, fair pricing. Cons: ecommerce-only, smaller template library, fewer non-store features.
#### 8. GetResponse
Best for marketing that leans on webinars.
GetResponse combines email marketing with native webinar hosting, landing pages, and conversion funnels. For businesses that generate leads through online events, having the webinar and the follow-up sequence in one tool is genuinely convenient.
GetResponse uses contact and feature tiers. It is worth comparing when webinars, landing pages, funnels, and email follow-up should live in one platform.
Pros: integrated webinars, broad feature set, solid automation. Cons: webinar quality is not best in class, the interface feels dated in places.
#### 9. HubSpot
Best for teams that want a full marketing suite.
HubSpot delivers email as one piece of a wider marketing, sales, and service platform built on a capable free CRM. If you want everything in one system and can fund it, the integration depth is real.
HubSpot's pricing depends on hub selection, contact tiers, seats, and feature level. Serious automation usually lives above the light entry path, so model the tier you would actually run.
Pros: all-in-one platform, strong CRM, deep reporting. Cons: expensive for email alone, sharp tier jumps, more than many small teams need.
### How to choose an email marketing provider
Three questions narrow the field quickly.
First, what is your pricing model risk? If you keep a large list but send selectively, per-email pricing (Brevo) protects you. If your list is small and highly engaged, per-contact pricing is fine.
Second, which channels do your customers actually use? If SMS and WhatsApp matter, Brevo and Omnisend handle them natively. If you are email-only, almost any option works.
Third, how much automation do you genuinely need? Casual senders are well served by Mailchimp or MailerLite. Teams running complex nurture logic should look at ActiveCampaign or, for stores, Klaviyo.
Decision: What describes your sending best?
- If Large list, selective sends: Brevo (Per-email pricing protects you; a small, engaged list is fine on per-contact pricing.)
- If Customers on SMS and WhatsApp: Brevo or Omnisend (Both handle those channels natively.)
- If Casual sending: Mailchimp or MailerLite (Enough automation without the overhead.)
- If Complex nurture logic: ActiveCampaign, or Klaviyo for stores (The deepest automation in the mid-market and in ecommerce.)
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is the best email marketing provider in 2026?**
It depends on the job. Brevo fits send-volume pricing and multichannel marketing, Klaviyo fits ecommerce data, Mailchimp fits simple campaign creation, ActiveCampaign fits deep automation, and MailerLite or Kit fit simpler newsletter workflows.
**Which email marketing service has the best free plan?**
Free plans change often. Compare daily or monthly send caps, subscriber caps, branding, automation access, support, and transactional email before choosing a free tier for production campaigns.
**What should I look for in an email marketing provider?**
Prioritise deliverability, the pricing model (per contact versus per email), automation depth, multi-channel support such as SMS and WhatsApp, CRM and ecommerce integrations, and how the cost scales as your list grows.
**What is the cheapest email marketing service?**
MailerLite, Kit, and Brevo are common low-cost shortlists, but the cheapest service depends on subscriber count, send frequency, branding requirements, and automation access. Brevo is often cost-effective at scale because send-volume pricing means a large stored list does not automatically inflate the bill.
**Which provider has the best deliverability?**
Deliverability depends heavily on your own list hygiene and authentication (SPF, DKIM, DMARC), but Brevo, Klaviyo, and ActiveCampaign consistently score well in independent tests. A clean, engaged list matters more than the logo on the dashboard.
**Should I pick per-contact or per-email pricing?**
Choose per-email pricing (Brevo) if you store a large list but send infrequently. Choose per-contact pricing (Mailchimp, Klaviyo) if your list is small and you mail it often.
**Can I switch providers without losing my list?**
Yes. Every platform here supports CSV export and import. Plan for re-authenticating your sending domain, rebuilding automations, and updating signup forms, and run both tools in parallel briefly during the cutover.
---
## Help Desk Software Comparison: Ticketing, AI, Channels, Pricing Models, and Support Fit (2026)
Source: https://tajo.io/blog/best-help-desk-software/
Published: 2026-03-22 · Updated: 2026-05-04
Compare help desk software by ticketing depth, AI support, support channels, knowledge base, ecommerce fit, pricing model, and team size.
Summary: Choose help desk software by channel mix, ticket volume, automation depth, AI needs, reporting, integrations, and agent pricing. A simple shared inbox, ecommerce support desk, and enterprise ticketing operation need different tools.
When tickets slip through the cracks, response times balloon and churn follows. Help desk software fixes that by pulling every customer conversation, whether it arrives by email, chat, social, or phone, into one organised queue your team can actually manage.
The catch is that "help desk" now spans everything from a glorified shared inbox to enterprise platforms with their own AI agents. We researched and compared the leading tools to bring you this breakdown: strong options for 2026, a side-by-side table, and a framework for picking. Pricing models vary by agent, seat, feature tier, ticket volume, AI usage, and annual billing, so confirm current rates.
### What to look for in help desk software
A few capabilities separate serious platforms from inbox add-ons:
- Ticketing and workflow automation, so requests are routed, escalated, and tracked without manual handling.
- Multi-channel support that unifies email, chat, social, and phone in one queue.
- A knowledge base for self-service that deflects repetitive tickets.
- Reporting on first response time, resolution time, and CSAT.
- Integrations and a solid API to connect your CRM, store, and marketing stack.
- AI features for classification, suggested replies, and chatbot deflection.
- Pricing that scales sensibly as you add agents.
### Help Desk Software by Fit
#### 1. Zendesk
Best for mid-size to enterprise teams that need a mature, full-featured platform.
Zendesk has refined its support suite for well over a decade, and it shows: deep automation, a large app marketplace, and capable AI agents. Pricing varies by suite tier, agent count, annual billing, and AI add-ons, so model the realistic cost above the headline entry plan.
Strengths: unmatched integrations, powerful macro and trigger system, mature AI. Weaknesses: pricing climbs fast, the admin interface has grown complex, and key features sit behind higher tiers.
#### 2. Freshdesk
Best for small to mid-size teams that want strong features without enterprise complexity.
Freshdesk, part of Freshworks, is the approachable Zendesk alternative. Pricing varies by agent count, automation depth, reporting, and Freddy AI access, with a free entry path that can be useful for very small teams.
Strengths: generous free tier, intuitive interface, solid automation, clean mobile app. Weaknesses: advanced reporting needs Pro, AI lags Zendesk and Intercom slightly, and it can feel sluggish at very high ticket volumes.
#### 3. Brevo
Best for teams that want customer support and marketing automation on one platform.
Brevo refuses to treat support as an island. Its Conversations feature combines live chat, chatbot automation, and a shared inbox, but the real advantage is how tightly it connects to Brevo's email, SMS, WhatsApp, and CRM. When an agent opens a ticket, they see purchase history, email engagement, and marketing segment in the same place.
Brevo Conversations has a free entry path and paid seat tiers. Because you are not paying separately for a help desk and a marketing platform, the all-in-one approach can reduce tool overlap.
Strengths: unified customer view across marketing and support, built-in chat widget, chatbot builder, WhatsApp and Instagram DM integration, shared CRM. Weaknesses: ticketing is lighter than dedicated tools, and advanced routing and SLA rules are limited, so high-volume support teams may outgrow it.
#### 4. Zoho Desk
Best for budget-conscious teams, especially those already using Zoho.
Zoho Desk delivers broad support features at value-oriented tiers. Verify agent limits, telephony, routing, SLA dashboards, Blueprint workflow automation, and Zia AI access before choosing a plan.
Strengths: aggressive pricing, feature-rich even on lower tiers, strong multi-channel support, tight Zoho ecosystem fit. Weaknesses: the interface feels dated next to Freshdesk, and non-Zoho integrations are more limited.
#### 5. Help Scout
Best for small teams that prioritise a clean, human-centred experience.
Help Scout uses a shared-inbox design so conversations feel like email rather than a ticket queue, and customers never see ticket numbers. Pricing is user and feature-tier based, with Docs and Beacon availability to verify by plan.
Strengths: beautiful, intuitive interface, strong Docs knowledge base, pleasant agent experience. Weaknesses: limited native social ticketing, basic reporting, and fewer automation options than the big platforms.
#### 6. Intercom
Best for SaaS and product-led companies that prioritise in-app messaging.
Intercom evolved from a chat widget into a full communication platform, and its Fin AI agent is among the most capable support bots available. Pricing depends on seats, automation features, AI usage, and resolution-based charges, so forecast usage before committing.
Strengths: best-in-class in-app messaging, sophisticated AI, excellent onboarding and product tours. Weaknesses: expensive and sometimes unpredictable as usage-based AI costs add up, and overkill for email-heavy support.
#### 7. LiveAgent
Best for teams that need built-in call center functionality.
LiveAgent bakes phone support into the help desk rather than charging extra for it. It can be attractive for teams that need call center, video chat, and social ticketing in one package, but verify current channel and agent limits.
Strengths: native call center with IVR, universal inbox, competitive pricing for the feature set. Weaknesses: dated, dense interface, longer setup, and a smaller integration ecosystem.
#### 8. Jira Service Management
Best for IT and DevOps teams in the Atlassian ecosystem.
Jira Service Management is Atlassian's ITSM tool and the natural choice if you already live in Jira and Confluence. It brings ITIL-aligned incident, problem, and change management into a flexible platform with pricing tied to agent count and ITSM feature needs.
Strengths: deep Jira integration, powerful workflow engine, strong ITSM capabilities, excellent dev-to-support collaboration. Weaknesses: heavy for general customer support, complex interface, and customer-facing features are less polished than dedicated help desks.
#### 9. Hiver
Best for small teams that want help desk features inside Gmail.
Hiver turns Google Workspace inboxes into a help desk: shared inboxes, ticket assignment, collision detection, and automation, all without leaving Gmail. Pricing is user and feature-tier based, with live chat, knowledge base, and SLA management to verify by plan.
Strengths: near-zero learning curve for Gmail users, fast setup, good collaboration. Weaknesses: tied to Gmail, limited beyond email at lower tiers, and it will not scale to large or complex operations.
### Help desk software comparison
| Platform | Pricing model to verify | AI features | Best channel | Fit signal |
|----------|-------------------------|-------------|--------------|------------|
| Zendesk | Agent, suite, and AI add-on tiers | Advanced | Omnichannel | Mature support operations |
| Freshdesk | Agent and feature tiers | Freddy AI | Omnichannel | Growing support teams |
| Brevo | User and conversation tiers | Chatbot | Chat + email | Support plus marketing data |
| Zoho Desk | Agent and feature tiers | Zia AI | Email + social | Zoho ecosystem users |
| Help Scout | User and feature tiers | Basic AI | Email + chat | Human shared-inbox support |
| Intercom | Seat, automation, and AI usage tiers | Fin AI | In-app chat | Product-led teams |
| LiveAgent | Agent and channel tiers | Basic AI | Phone + email | Call-center-heavy teams |
| Jira Service Management | Agent and ITSM tiers | Moderate | ITSM portal | Atlassian teams |
| Hiver | User and feature tiers | Basic AI | Gmail | Google Workspace teams |
### How to choose the right help desk software
What is your primary channel? Email-first teams suit Help Scout or Hiver; chat-first teams suit Intercom or Brevo Conversations; phone-heavy teams suit LiveAgent; and true omnichannel points to Zendesk or Freshdesk.
Decision: What is your primary support channel?
- If Email: Help Scout or Hiver (Shared-inbox support that feels like email.)
- If Chat: Intercom or Brevo Conversations (In-app messaging or chat tied to marketing data.)
- If Phone: LiveAgent (Native call center with IVR in the help desk.)
- If True omnichannel: Zendesk or Freshdesk (Email, chat, social and phone in one queue.)
What is your team size and budget? Solo founders and tiny teams should compare free entry paths carefully, while mid-size teams should model agent count, reporting, channels, and automation before buying. Enterprises should evaluate Zendesk or Jira Service Management.
Do you need more than a help desk? This is the deciding question for many teams. Running a separate help desk, CRM, and email tool creates data silos that hurt the customer experience. Platforms like Brevo and HubSpot keep support, CRM, and marketing in one place, so an agent handling an order question can see purchases, email history, and loyalty status without switching tabs.
### Where support and marketing meet
The most useful trend in this category is the merge of support and marketing data. When your help desk and your email and SMS platform share one customer database, you stop sending promotions to people with open complaints and start triggering win-back campaigns the moment a ticket is resolved.
Support agents see the full customer picture, and marketing automations can factor in support history. That is the integration that turns good support into a retention engine.
### Final thoughts
There is no single help desk for every team. Freshdesk offers a strong balance of features and price for many growing teams, Zendesk remains the standard for large operations, and Brevo is useful when you want support and marketing on one platform rather than in parallel silos.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is the best help desk software in 2026?**
The right help desk depends on support volume and channel mix. Zendesk fits complex operations, Freshdesk fits growing teams, Help Scout fits simple shared-inbox support, Intercom fits product-led chat, and Gorgias fits ecommerce teams.
**Are there free help desk software solutions available?**
Some help desk vendors offer free entry tiers, but limits change. Verify agent caps, ticket volume, channels, automation, reporting, AI usage, and knowledge base limits before relying on a free tier.
**How do I choose the right help desk software?**
Start with your primary support channel, your team size, and your budget. Decide whether you need a standalone ticketing tool or an all-in-one platform that also covers CRM and marketing, then trial two or three finalists before committing.
**What is help desk software?**
It is a platform that converts inbound requests from email, chat, phone, and social into trackable tickets, then provides routing, collaboration, knowledge base, and reporting tools to resolve them efficiently.
**How much does help desk software cost?**
Free entry paths exist for some vendors, but limits vary. Paid cost depends on agents, channels, AI usage, automation, reporting, knowledge base, and enterprise controls.
**Can small businesses use help desk software?**
Yes. Several vendors offer free entry paths, but limits vary by agent count, channel access, automation, reporting, and knowledge base. Treat them as starting points and verify the exact limits before moving real support volume.
**What is the difference between a help desk and a ticketing system?**
A ticketing system creates, tracks, and resolves tickets. Help desk software is broader, adding a knowledge base, live chat, reporting, automation, and integrations on top. The ticketing system is the engine; the help desk is the whole car.
**Should I choose a standalone help desk or an all-in-one platform?**
If you already have a CRM and marketing stack you like, a standalone tool such as Zendesk or Freshdesk gives the deepest support features. If you want to consolidate tools and reduce silos, an all-in-one platform like Brevo puts support, CRM, and marketing together, often at a lower combined cost.
---
## Klaviyo Replacement Matrix: Ecommerce Email, SMS, Pricing Models, Migration, and Platform Fit (2026)
Source: https://tajo.io/blog/best-klaviyo-alternatives/
Published: 2026-03-01 · Updated: 2026-05-16
Compare Klaviyo alternatives by ecommerce depth, channels, pricing model, data sync, migration risk, and Shopify fit using current market signals.
Summary: Klaviyo is powerful, but ecommerce teams should compare alternatives by pricing model, profile limits, channels, Shopify data depth, migration risk, and add-on requirements.
Klaviyo earned its place as the default email and SMS platform for Shopify stores. The segmentation is excellent, the ecommerce data model is mature, and the flows convert. The problem most merchants run into is not capability. It is the bill.
Klaviyo prices primarily around active profiles and usage, which means the buying decision changes as list size, SMS volume, and add-ons grow. A store with a high percentage of dormant contacts should compare that model against platforms that price by send volume, seats, features, or ecommerce package.
If you are paying for Klaviyo and wondering whether another stack can preserve revenue while changing the cost curve, this guide is for you. We refreshed the page with vendor pricing-page research on May 24, 2026, then compared the strongest alternatives on pricing model, ecommerce depth, channel coverage, migration risk, and where each platform is actually a good fit.
### Quick comparison
| Platform | Best fit | Pricing model to verify | Ecommerce focus | Migration note |
|----------|----------|-------------------------|-----------------|----------------|
| **Omnisend** | Ecommerce teams that want prebuilt email, SMS, and push workflows | Contacts, sends, SMS credits, feature tier | Native ecommerce | Fastest ecommerce setup, but still list-size sensitive |
| **Mailchimp** | General SMB email teams that value familiarity | Contacts, audiences, seats, feature tier | Basic to moderate | Easier for simple newsletters than complex lifecycle marketing |
| **ActiveCampaign** | Teams with CRM, sales handoff, and complex automation needs | Contacts, seats, add-ons, tier gates | Good | Strong logic, but ecommerce reporting takes more setup |
| **GetResponse** | Teams combining email, funnels, and webinars | Contacts, automation tier, add-ons | Good | Useful if webinars or funnels are central |
| **MailerLite** | Simpler email programs and creator-style lists | Subscribers, feature tier, sends | Basic | Easy migration for straightforward campaigns |
| **Drip** | Ecommerce lifecycle teams that prioritize behavior data | Contacts and feature tier | Native ecommerce | Closest to Klaviyo-style lifecycle thinking |
| **Sendlane** | Ecommerce lifecycle teams with onsite capture needs | Contacts, sends, SMS, feature tier | Native ecommerce | Good candidate when capture and lifecycle should consolidate |
Pricing pages change frequently. Use this table to compare models, then verify current tiers, contact thresholds, SMS rates, send limits, and add-on requirements on each vendor pricing page before buying.
### Why look beyond Klaviyo
Klaviyo is a great product. Merchants still leave it, and the reasons cluster around a few recurring pain points.
- **Per-profile pricing scales painfully.** You pay for every contact whether they engage or not. As your list grows, so does the monthly cost, with no relief for inactive profiles.
- **SMS is largely US-centric.** International SMS coverage and per-message economics are weaker for stores selling across borders.
- **No native WhatsApp.** For markets in Europe, Latin America, the Middle East, and Asia where WhatsApp is the dominant channel, that is a real gap.
- **No built-in loyalty.** Repeat-purchase programs require a separate app and another subscription.
- **More than small stores need.** The depth that makes Klaviyo great for large brands is overkill for a store running a welcome series and an abandoned-cart flow.
None of this means you should leave. It means you should check whether a different pricing model and a broader channel mix would serve you better at your stage.
#### How Klaviyo costs change as you grow
Do not evaluate Klaviyo from the entry tier alone. Build a price check around your actual active profile count, monthly email sends, SMS volume, reviews or CDP needs, and whether you need multiple brands or regions. Then compare that against vendors with different models:
| Model | What to check | Why it matters |
|-------|---------------|----------------|
| Active-profile pricing | Active profile thresholds, suppression behavior, SMS credits, reviews/CDP add-ons | Costs can rise even when part of the list is inactive |
| Send-volume pricing | Monthly email allowance, overages, included contacts, automation limits | Better fit when a large list receives selective campaigns |
| Contact/subscriber pricing | Subscriber thresholds, duplicate audiences, automation gates | Simple to budget until list growth accelerates |
| Seat or hub pricing | User seats, CRM features, reporting limits, automation tier | Relevant when sales, support, and marketing all need access |
The pattern is the point: your lowest advertised entry price rarely predicts the bill at ecommerce scale.
### The 8 best Klaviyo alternatives in 2026
#### 2. Omnisend
**Best for:** Shopify and WooCommerce stores that want ecommerce automation working out of the box.
Omnisend is built for ecommerce, and it shows. Pre-built workflows for welcome, cart recovery, browse abandonment, and post-purchase are ready to switch on, and email, SMS, and push live in one automation.
**Key features:** ecommerce automation library, email plus SMS plus push, product picker and discount codes in emails, deep Shopify integration, campaign booster for resends.
**Pricing model:** Omnisend uses contact and feature tiers, with send allowances and SMS economics that need current verification for your country mix.
**Pros:** Fastest ecommerce setup, strong templates, transparent tiers. **Cons:** Still per-contact pricing, so it climbs with list size; no WhatsApp; no native loyalty.
#### 3. Mailchimp
**Best for:** Beginners who value a familiar interface and broad brand recognition.
Mailchimp is the most recognized name in email marketing and the easiest on-ramp for someone new to the discipline. Its ecommerce features are basic next to Klaviyo, but for a smaller store running straightforward campaigns and a few journeys, it is more than enough.
**Key features:** customer journeys, product recommendations, order notifications, a website and landing-page builder, generative content tools.
**Pricing model:** Mailchimp pricing depends on contacts, audiences, features, and seats. Verify how your list, duplicate contacts, and automation needs map to the current tier.
**Pros:** Gentle learning curve, large template gallery, strong brand trust. **Cons:** Ecommerce automation is shallow; costs rise quickly at higher tiers; advanced segmentation lags Klaviyo.
#### 4. ActiveCampaign
**Best for:** Businesses that want serious automation plus a built-in CRM.
ActiveCampaign pairs one of the best visual automation builders on the market with a native CRM, site tracking, and lead scoring. It is less ecommerce-pure than Klaviyo or Omnisend but stronger when your marketing and sales motions overlap, for example a store with a B2B wholesale arm.
**Key features:** visual automation builder, built-in CRM and sales automation, site and event tracking, lead scoring, Shopify integration.
**Pricing model:** ActiveCampaign pricing depends on contacts, plan tier, seats, CRM needs, and add-ons. Verify the tier that unlocks ecommerce, lead scoring, and reporting features you require.
**Pros:** Best-in-class automation logic, CRM included, flexible across use cases. **Cons:** Ecommerce reporting is less turnkey; the depth has a learning curve; per-contact pricing.
#### 5. GetResponse
**Best for:** Stores that also run webinars or conversion funnels.
GetResponse bundles email marketing with a webinar platform, conversion funnels, landing pages, and automation. The combination is unusual and useful if events are part of how you sell. Its ecommerce tooling is solid without matching the specialists.
**Key features:** ecommerce tools and product recommendations, webinar hosting, conversion funnels, automation, landing pages, SMS.
**Pricing model:** GetResponse pricing depends on list size and plan tier. Verify whether automation, ecommerce, SMS, and webinar features sit in the tier you intend to buy.
**Pros:** Webinars plus email in one place, good funnel builder. **Cons:** Ecommerce depth trails Klaviyo and Omnisend; the bundle is wasted if you never run webinars.
#### 6. MailerLite
**Best for:** Budget-conscious stores and creators that want clean, simple email.
MailerLite is the value pick for merchants who do not need the full ecommerce arsenal. It is easy to learn, inexpensive, and includes landing pages, automation, and basic ecommerce blocks. The free plan is genuinely useful.
**Key features:** drag-and-drop editor, automation, landing pages and pop-ups, ecommerce blocks for selling digital and physical products, A/B testing on paid plans.
**Pricing model:** MailerLite pricing depends on subscriber count, send limits, and feature tier. Confirm current free-plan limits, automation access, and ecommerce blocks before migrating.
**Pros:** Excellent value, very clean UX, useful free tier. **Cons:** Lighter ecommerce automation; no SMS or WhatsApp; segmentation is basic relative to Klaviyo.
#### 7. Drip
**Best for:** Ecommerce brands focused on behavior-driven lifecycle marketing.
Drip is built around the ecommerce customer journey, with a visual workflow builder, revenue attribution, and behavior-based automation. It sits closest to Klaviyo in philosophy, prioritizing data and lifecycle over breadth of channels.
**Key features:** ecommerce CRM, visual workflow builder, behavior-based triggers, revenue attribution, deep store integrations.
**Pricing model:** Drip prices around contact count and ecommerce features. Verify the tier and list-size band against your real customer database.
**Pros:** Strong lifecycle and attribution, ecommerce-native data model. **Cons:** Higher entry price than most alternatives; email-centric, so multi-channel is limited.
#### 8. Privy (now with Sendlane)
**Best for:** Shopify stores that want onsite capture and lifecycle marketing together.
Sendlane and Privy are relevant when onsite capture and ecommerce lifecycle messaging need to work as one motion. The result is a single buying conversation around onsite conversion, email, SMS, and follow-up messaging, which is appealing for stores that previously stitched those together.
**Key features:** pop-up and onsite display builder, email and SMS, cart saver, cross-sell displays, Shopify-native integration; lifecycle automation strengthened by the Sendlane addition.
**Pricing model:** Verify current Sendlane and Privy packaging, contact thresholds, send limits, SMS costs, and whether capture features are included or sold separately.
**Pros:** Excellent list-building and onsite tools, now with deeper lifecycle messaging. **Cons:** The combined platform is still consolidating; segmentation and reporting are not yet at Klaviyo's depth; per-contact pricing.
### Feature comparison
#### Ecommerce capabilities
|---------|---------|--------------|----------|------|
| Abandoned cart | Yes | Yes | Yes | Yes |
| Browse abandonment | Yes | Yes | Yes | Yes |
| Product recommendations | Yes | Yes | Yes | Basic |
| Back in stock | Yes | Yes | Yes | No |
| Price-drop alerts | Yes | Yes | Yes | No |
| Loyalty programs | No (app) | Yes (built in) | No | No |
#### Channel coverage
| Channel | Klaviyo | Brevo | Omnisend | ActiveCampaign |
|---------|---------|-------|----------|----------------|
| Email | Yes | Yes | Yes | Yes |
| SMS | US-centric | 200+ countries | US/CA/UK | US/CA |
| WhatsApp | No | Yes | No | No |
| Web push | No | Yes | Yes | No |
#### Pricing model
| Platform | Charges by | Inactive contacts cost you |
|----------|------------|-----------------------------|
| Klaviyo | Active profiles | Yes |
| Brevo | Emails sent | No |
| Omnisend | Contacts | Yes |
| Mailchimp | Contacts | Yes |
| Drip | Contacts | Yes |
The pricing-model row is the one most worth studying. A per-email model like Brevo's decouples your bill from how many dormant contacts sit in your list, which is precisely where per-profile platforms become expensive.
### How to pick the right alternative
#### By budget
- **Tight:** Brevo when send-volume economics are favorable, or MailerLite for simpler email programs.
- **Mid-range:** Omnisend for ecommerce speed or ActiveCampaign for automation plus CRM.
- **Premium:** Drip or Sendlane when lifecycle depth is worth the contact-based cost.
#### By store platform
- **WooCommerce:** Brevo for value; Drip for lifecycle; ActiveCampaign for automation plus CRM.
#### By priority
- **Lowest cost at scale:** Brevo (per-email, unlimited contacts).
- **Easiest ecommerce setup:** Omnisend.
- **Best multi-channel:** Brevo (email, global SMS, WhatsApp, push).
- **Best automation logic:** ActiveCampaign or Drip.
Decision: What is your top priority?
- If Lowest cost at scale, or most channels: Brevo (Per-email pricing, unlimited contacts; email, global SMS, WhatsApp, push.)
- If Easiest ecommerce setup: Omnisend (Prebuilt workflows ready to switch on.)
- If Best automation logic: ActiveCampaign or Drip (Deep workflow logic and behavior-driven journeys.)
### Migrating from Klaviyo
A switch is less daunting than it looks if you prepare before you move.
**Before you switch:**
1. Export your contacts with all custom properties and consent status.
2. Document your live flows: welcome, abandoned cart, browse abandonment, post-purchase, win-back. Screenshot the logic.
3. Note your integrations, including the Shopify connection and any apps that read from Klaviyo.
**Migration steps:**
2. Import contacts and verify consent and segmentation carried over.
3. Recreate your critical flows, starting with the highest-revenue ones.
4. Test on a small segment and confirm triggers fire on real store events.
5. Run both platforms in parallel briefly to compare deliverability.
6. Switch your forms and sign-up sources, then monitor deliverability closely for the first two weeks.
Sequence, triggered by: Leaving Klaviyo
1. Prepare
2. Import contacts
3. Recreate critical flows
4. Test on a small segment
5. Run both in parallel
6. Switch forms and sign-up sources
Outcome: Retire Klaviyo once new flows fire on live traffic
Keep Klaviyo active until your new flows have fired correctly on live traffic. The overlap costs a little but protects revenue during the cutover.
### Conclusion
Klaviyo is excellent, and large brands with the budget to match its per-profile model are right to stay. For everyone else, the alternatives have closed the feature gap while pricing more kindly as you grow.
- **Best for fast ecommerce setup:** Omnisend, with workflows ready out of the box.
- **Best for beginners:** Mailchimp, the gentlest learning curve.
- **Best for lifecycle depth:** Drip, for behavior-driven journeys.
Ready to cut your email marketing bill without cutting capability?
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**Why do merchants switch away from Klaviyo?**
Merchants usually evaluate alternatives when profile-based pricing rises faster than revenue, SMS or WhatsApp coverage does not fit their market, or they need loyalty, CRM, or transactional messaging without adding more point tools.
**Is there a free Klaviyo alternative?**
Yes. Several vendors offer free or trial tiers, but the useful comparison is not only whether a free tier exists. Check contact limits, send limits, branding, automation access, SMS availability, and what happens when the store grows past the test stage.
---
## Landing Page Builder Guide: Forms, Templates, Testing, Pricing Models, and Fit (2026)
Source: https://tajo.io/blog/best-landing-page-builders/
Published: 2026-03-22 · Updated: 2026-05-09
Compare landing page builders by editor quality, forms, testing, templates, integrations, pricing model, and campaign fit using current market signals.
Summary: Choose a landing page builder by campaign type. Unbounce and Instapage fit paid-acquisition teams, Leadpages and Landingi fit small teams that need volume, Carrd fits simple pages, and Brevo fits teams that want pages connected to email, SMS, CRM, and automation.
A landing page builder can be the difference between a campaign that converts and one that bleeds budget. Whether you are launching a product, running paid ads, or building an email list, the right tool lets you publish high-converting pages in minutes rather than weeks.
But choosing a landing page builder is not straightforward. Some tools specialize in conversion optimization, others bundle landing pages into a larger marketing suite, and a few are useful for lightweight validation pages.
The comparison below covers editor quality, form handling, testing features, integrations, pricing models, and the real-world use cases where each tool fits.
### What to Look For in a Landing Page Builder
Before comparing individual tools, it is worth establishing what actually matters when evaluating a landing page creator. Not every feature is equally important for every business.
#### Drag-and-Drop Editor Quality
The editor is where you spend most of your time. Look for a drag and drop landing page builder that offers precise control over layout, spacing, and element positioning. The best editors feel intuitive from the first session and do not force you into rigid grid systems.
#### Template Library
Starting from a blank canvas works for designers, but most marketers need proven templates as starting points. Evaluate both the quantity and quality of templates. A library of 500 mediocre templates is less useful than 50 well-designed, conversion-focused ones.
#### A/B Testing
Split testing is how you turn a good landing page into a great one. Some builders include native A/B testing, others require third-party integrations, and a few do not support it at all. If conversion optimization is a priority, native A/B testing saves significant time.
#### Integrations
Your landing page builder needs to connect with your existing marketing stack. Key integrations include email marketing platforms, CRM systems, payment processors, analytics tools, and webhook support for custom workflows.
#### Page Speed and Performance
Page load time directly impacts conversion. Check whether the builder produces clean, optimized pages, whether it supports image optimization and mobile previews, and whether heavier scripts from forms, analytics, chat, or personalization tools slow the final experience.
#### Pricing and Scalability
Free plans are great for testing, but understand what happens as you grow. Some tools charge per page, others per visitor, and some offer unlimited pages on every plan. Calculate the real cost at your expected traffic levels.
#### Form and Lead Capture Features
Forms are the conversion mechanism on most landing pages. Advanced form features like multi-step forms, conditional logic, hidden fields, and progressive profiling can meaningfully improve lead quality and capture rates.
### Landing page builder shortlist for 2026
#### 1. Unbounce
**Best for:** Performance marketers focused on conversion optimization
Unbounce pioneered the dedicated landing page builder category and remains one of the most powerful options available. Its Smart Traffic feature uses AI to automatically route visitors to the page variant most likely to convert them, which goes beyond traditional A/B testing.
**Key Features:**
- Smart Builder with AI-powered design suggestions
- Smart Traffic for automatic visitor-level optimization
- Dynamic Text Replacement for PPC campaign personalization
- Over 100 high-converting templates
- Popups and sticky bars included
- AMP landing page support for mobile speed
**Pricing model:**
Unbounce pricing is tied to plan tier, visitor allowances, page limits, testing features, and optimization tools. Verify the current Build, Experiment, and Optimize plan gates before moving paid traffic.
**Strengths:**
Unbounce delivers one of the strongest conversion optimization toolsets in the category. Smart Traffic, dynamic text replacement, and testing workflows are built for teams that need to improve paid-campaign performance over time. The editor is flexible, and the template library is consistently high quality.
**Limitations:**
The price point is steep for small businesses and solopreneurs. There is no free plan, and even the entry tier limits you to 20,000 visitors. The learning curve is moderate, though significantly easier than building pages from scratch.
**Verdict:** If your primary goal is maximizing conversions on paid traffic and you have the budget, Unbounce is the top choice. It is overkill for simple lead capture pages, but unmatched for performance marketing.
---
#### 2. Leadpages
**Best for:** Small businesses and entrepreneurs who need speed and simplicity
Leadpages focuses on making landing page creation fast and accessible. It strikes an effective balance between ease of use and conversion features, making it a popular choice for small businesses running their first campaigns.
**Key Features:**
- Drag-and-drop builder with mobile-responsive design
- Over 200 conversion-optimized templates
- Built-in checkout and payment processing
- Unlimited traffic and leads on all plans
- Alert bars and pop-ups included
- Native A/B testing on higher plans
**Pricing model:**
Leadpages pricing is organized around site count, testing access, payment features, and account needs. Verify current plan gates if you need A/B testing or multiple client sites.
**Strengths:**
Leadpages offers unlimited traffic and leads even on its cheapest plan, which eliminates surprise overages. The template library is one of the largest available, and the built-in payment processing means you can sell directly from landing pages without additional tools.
**Limitations:**
A/B testing is locked behind the Pro plan. The editor, while easy to use, is less flexible than Unbounce or Instapage for complex designs. Some templates show their age and could use a refresh.
**Verdict:** Leadpages is an excellent all-around landing page builder for small businesses. The unlimited traffic model and built-in payments make it particularly strong for businesses that sell digital products or services directly.
---
#### 3. Brevo (formerly Sendinblue)
**Best for:** Businesses that want landing pages integrated into a full marketing suite
Brevo stands apart from dedicated landing page builders because it bundles page creation into a comprehensive marketing platform that includes email marketing, SMS campaigns, CRM, marketing automation, and transactional messaging. If you already use or plan to use Brevo for email marketing, adding landing pages to your workflow requires no additional tools or subscriptions.
**Key Features:**
- Drag-and-drop landing page builder with responsive templates
- Built-in form builder with advanced field types
- Direct connection to Brevo email lists and automation workflows
- Marketing automation triggers based on landing page activity
- CRM integration for lead management
- SMS and WhatsApp follow-up capabilities
- A/B testing for email campaigns connected to landing pages
**Pricing model:**
Brevo bundles landing pages into a wider marketing platform. Verify current plan gates for landing-page publishing, automation, A/B testing, CRM features, SMS, WhatsApp, and sending volume.
**Strengths:**
The real power of Brevo as a landing page creator is the seamless connection between your pages and your marketing automation. When a visitor submits a form on a Brevo landing page, they can immediately enter a multi-step email sequence, receive an SMS confirmation, get tagged in your CRM, and trigger a sales notification, all without any third-party integrations or Zapier workflows. This end-to-end approach eliminates data silos and reduces the friction that causes leads to fall through the cracks.
The form builder is robust, supporting custom fields, hidden fields, and GDPR-compliant consent checkboxes. Landing page templates are clean and modern, though the library is smaller than dedicated tools like Unbounce or Leadpages.
**Limitations:**
The landing page editor is less advanced than purpose-built tools. You will not find features like Smart Traffic or dynamic text replacement. The template selection is growing but still more limited than dedicated landing page platforms. For teams that only need landing pages and nothing else, a dedicated builder may offer more design flexibility.
**Verdict:** Brevo is the strongest choice for businesses that want landing pages tightly connected to email, SMS, CRM, and automation workflows.
---
#### 4. Wix
**Best for:** Beginners who need a complete website and landing pages in one platform
Wix is primarily a website builder, but its landing page capabilities have matured significantly. If you already run your main website on Wix, building landing pages within the same ecosystem avoids the complexity of managing multiple platforms.
**Key Features:**
- ADI (Artificial Design Intelligence) for AI-generated page layouts
- Wix Editor with full design freedom
- Over 900 templates (many suitable for landing pages)
- Built-in analytics and visitor tracking
- App market with hundreds of add-ons
- Free plan with Wix branding and subdomain
**Pricing model:**
Wix pricing depends on site plan, ecommerce requirements, storage, branding, custom domain needs, and app-market add-ons. Verify the current plan if landing pages need payments, forms, or ad integrations.
**Strengths:**
Wix offers the most design freedom of any builder on this list. The editor is truly freeform, meaning you can place elements anywhere on the canvas without grid constraints. The free plan is one of the most generous available, letting you build and publish pages at no cost.
**Limitations:**
Pages built on Wix tend to load slower than those from dedicated landing page tools, which can hurt conversion rates. There is no native A/B testing for landing pages. The free plan displays prominent Wix advertising on your pages, which undermines credibility for business use.
**Verdict:** Wix makes sense if you need both a website and landing pages on one platform and design flexibility is a priority. It is not the best choice if page speed and conversion optimization are your top concerns.
---
#### 5. Carrd
**Best for:** Minimalists and indie makers who need simple, fast pages
Carrd is the most lightweight landing page builder on this list. It excels at one-page sites that load quickly and look clean. It is also one of the lowest-cost paid options in the category.
**Key Features:**
- Single-page site builder with responsive design
- Clean, modern templates
- Form support with basic integrations
- Custom domain support on Pro plans
- Embeddable widgets and third-party code
- SSL included on all plans
**Pricing model:**
Carrd prices by site count and feature set. Verify current limits for custom domains, forms, embeds, analytics, widgets, and branding removal.
**Strengths:**
Carrd produces lightweight landing pages. The simplicity is a feature, not a limitation, as it forces you to focus on a single message and call-to-action.
**Limitations:**
No A/B testing. No multi-page sites on any plan. Limited form functionality (no conditional logic or multi-step forms). The editor is simple, which means less control over complex layouts. No native analytics beyond basic page views.
**Verdict:** Carrd is perfect for personal projects, quick validation pages, link-in-bio pages, and situations where you need a clean landing page in under 30 minutes. It is not the right tool for complex marketing campaigns or teams that need conversion optimization features.
---
#### 6. MailerLite
**Best for:** Email-first businesses that want landing pages bundled with their email platform
MailerLite takes a similar approach to Brevo by including landing pages within a broader email marketing platform, though it focuses more narrowly on email rather than offering the full multi-channel suite that Brevo provides.
**Key Features:**
- Drag-and-drop landing page builder
- Integration with MailerLite email campaigns and automation
- E-commerce blocks for selling digital products
- Pop-ups and embedded forms
- Custom domain support
- A/B testing for landing pages (paid plans)
**Pricing model:**
MailerLite pricing depends on subscribers, email volume, landing-page limits, branding, and advanced automation or A/B testing access. Verify the current free tier and paid plan gates.
**Strengths:**
MailerLite offers one of the best free landing page builder experiences. The free plan includes 10 landing pages with no visitor limits, which is more than enough for testing. The email-to-landing-page workflow is smooth, and the overall interface is exceptionally clean and easy to learn.
**Limitations:**
The landing page editor is functional but basic compared to dedicated tools. Template variety is limited. Advanced features like A/B testing require a paid plan. The platform lacks CRM, SMS, and multi-channel capabilities that tools like Brevo offer.
**Verdict:** MailerLite is a strong choice for bootstrapped businesses that prioritize email marketing and want landing pages as an integrated add-on. The free plan is genuinely useful, and the paid plans are among the most affordable available.
---
#### 7. Instapage
**Best for:** Agencies and enterprise teams running high-volume ad campaigns
Instapage positions itself as the enterprise-grade landing page platform. It offers the most advanced post-click optimization features of any tool on this list, including heatmaps, granular analytics, and real-time collaboration tools designed for teams.
**Key Features:**
- Instablocks for reusable page sections
- Built-in heatmaps and analytics
- Real-time visual collaboration (like Google Docs for landing pages)
- AdMap for connecting ads to relevant landing pages
- Thor Render Engine for fast page loads
- Dynamic text replacement
- Server-side A/B testing
**Pricing model:**
Instapage pricing depends on plan tier, collaboration features, traffic, testing, heatmaps, multi-step forms, and enterprise support. Verify current plan gates before choosing it for agency or enterprise work.
**Strengths:**
Instapage delivers the best collaboration experience for teams. The ability to comment, review, and iterate on pages in real time eliminates the back-and-forth of screenshots and email threads. The heatmap data and analytics dashboard provide deeper insights than most competitors.
**Limitations:**
Instapage is one of the premium options in this category. The learning curve is steeper than simpler tools. For solo marketers or small teams, the collaboration features can add cost without proportional benefit.
**Verdict:** Instapage is the right choice for agencies managing landing pages across multiple client accounts and for enterprise marketing teams running large-scale ad campaigns. The collaboration tools and advanced analytics justify the premium price at that scale.
---
#### 8. HubSpot
**Best for:** Sales-driven businesses that need landing pages connected to a powerful CRM
HubSpot includes a landing page builder as part of its Marketing Hub, making it a natural choice for businesses already invested in the HubSpot ecosystem. The tight integration with HubSpot CRM means every landing page interaction feeds directly into your contact records and sales pipeline.
**Key Features:**
- Drag-and-drop landing page editor
- Smart content that personalizes pages based on visitor data
- Built-in forms with progressive profiling
- Full CRM integration with lifecycle stage tracking
- Detailed analytics and attribution reporting
- A/B testing on Professional plans and above
**Pricing model:**
HubSpot pricing depends on hub tier, contacts, seats, automation, testing, reporting, and CRM requirements. Verify whether the landing-page features you need are available in Starter or require a higher Marketing Hub tier.
**Strengths:**
No other landing page builder matches HubSpot for lead intelligence. Because every form submission connects to a full CRM record, you can see the complete journey from first page visit to closed deal. Smart content allows you to show different page versions to different segments automatically.
**Limitations:**
The pricing cliff between entry-level and advanced HubSpot tiers can be dramatic. Most serious landing-page campaigns need careful verification of A/B testing, smart content, automation, and reporting access before committing.
**Verdict:** HubSpot is a strong landing page builder if you already use HubSpot CRM and are on the Professional plan or above. Starting from scratch with HubSpot solely for landing pages makes no financial sense given the pricing structure.
---
#### 9. ConvertFlow
**Best for:** Marketers who want to personalize the entire on-site experience
ConvertFlow goes beyond traditional landing pages by offering a suite of on-site conversion tools including landing pages, pop-ups, quizzes, surveys, and sticky bars, all with built-in personalization based on visitor behavior and CRM data.
**Key Features:**
- Landing pages, pop-ups, quizzes, and surveys in one tool
- Visitor-level personalization based on behavior and CRM data
- Multi-step funnels and conditional logic
- Direct integrations with major email and CRM platforms
- Built-in targeting and segmentation rules
- A/B testing across all conversion tool types
**Pricing model:**
ConvertFlow pricing depends on traffic, team needs, branding, personalization, funnel complexity, and integrations. Verify visitor bands and feature gates against expected campaign volume.
**Strengths:**
ConvertFlow excels at building personalized funnels that adapt based on who the visitor is and what they have done before. The quiz builder is particularly strong for lead qualification, and the ability to combine landing pages with pop-ups and sticky bars in coordinated campaigns is unique.
**Limitations:**
The landing page builder itself is less polished than dedicated tools like Unbounce or Leadpages. The visitor-based pricing can get expensive at higher traffic levels. The platform has a steeper learning curve due to the breadth of features.
**Verdict:** ConvertFlow is the right choice if you want to build personalized conversion experiences that go beyond static landing pages. It is especially effective for businesses with complex buyer journeys that benefit from multi-step funnels and adaptive content.
---
#### 10. Landingi
**Best for:** Mid-market businesses that need landing page volume at a reasonable price
Landingi is a dedicated landing page platform from Poland that has built a loyal following by offering a comprehensive feature set at prices significantly lower than Unbounce or Instapage. It targets the sweet spot between basic tools and enterprise platforms.
**Key Features:**
- Drag-and-drop builder with pixel-perfect control
- Over 400 templates across multiple industries
- Smart Sections for reusable content blocks
- Built-in pop-ups and lead capture forms
- PageInsider AI for conversion optimization suggestions
- EventTracker for micro-conversion monitoring
**Pricing model:**
Landingi pricing depends on page volume, visit allowances, branding, A/B testing, sub-accounts, and agency features. Verify current limits before using it for high-volume campaign production.
**Strengths:**
Landingi delivers strong value for teams that need page volume. The template library is large and well-organized by industry, and the PageInsider AI tool provides useful optimization recommendations.
**Limitations:**
A/B testing is limited to higher plans. The platform is less well-known, which means fewer community resources and third-party tutorials. Some integrations require workarounds through webhooks rather than native connections. The editor occasionally feels less refined than top-tier competitors.
**Verdict:** Landingi is an excellent mid-range option for businesses that need to produce landing pages at scale without enterprise pricing. The unlimited pages on the Professional plan make it particularly cost-effective for teams running multiple campaigns simultaneously.
---
### Landing Page Builder Comparison Table
| Tool | Free or trial path | Pricing model to verify | A/B testing | Templates | Integrations | Best for |
|------|--------------------|-------------------------|-------------|-----------|-------------|----------|
| Unbounce | Trial path | Visitor limits, optimization tier, testing features | Strong | Large | Strong | Conversion optimization |
| Leadpages | Trial path | Site count, testing tier, payments, account limits | Tier gated | Large | Good | Small businesses |
| Brevo | Free entry path | Marketing-suite tier, sending volume, automation, SMS/WhatsApp | Tier gated | Focused | Strong within Brevo | Full marketing suite |
| Wix | Free entry path | Site plan, custom domain, ecommerce, apps | Limited | Very large | App market | Complete websites |
| Carrd | Free entry path | Site count, custom domains, forms, embeds | No | Focused | Limited | Simple pages |
| MailerLite | Free entry path | Subscriber count, page limits, branding, automation | Tier gated | Moderate | Good | Email-first businesses |
| Instapage | Trial path | Collaboration, heatmaps, traffic, enterprise features | Strong | Large | Strong | Agencies and enterprise |
| HubSpot | Free entry path | Hub tier, contacts, seats, testing, automation | Higher-tier | Focused | Very strong CRM | CRM-driven teams |
| ConvertFlow | Free entry path | Visitors, personalization, team features | Tier gated | Moderate | Good | Personalized funnels |
| Landingi | Free entry path | Page volume, visits, sub-accounts, testing | Tier gated | Large | Good | Mid-market volume |
### Free vs Paid Landing Page Builders: What You Actually Get
Free landing page builders are a legitimate option for certain use cases, but understanding their limitations helps you set realistic expectations.
#### What Free Plans Typically Include
- Basic drag-and-drop editor
- A handful of templates
- Form capture with limited fields
- Subdomain hosting (e.g., yoursite.toolname.com)
- Tool branding on your published pages
- Limited monthly visitors or page views
#### What You Unlock with Paid Plans
- Custom domain support
- Removal of tool branding
- A/B testing and analytics
- Advanced form features (multi-step, conditional logic)
- Priority support and faster load times
- Team collaboration features
- Automation and CRM integrations
#### When Free is Enough
A free landing page builder works well when you are validating a new idea, building a personal project, capturing basic leads for a side project, or testing a tool before committing. Carrd's free plan, MailerLite's 10-page allowance, and Brevo's free tier are all genuinely useful for these scenarios.
#### When You Should Pay
Invest in a paid landing page builder when you are running paid advertising (tool branding undermines ad credibility), when you need A/B testing to optimize conversions, when you require custom domains for brand consistency, or when you are generating leads at volume and need reliable integrations.
### Best Landing Page Builder for Different Use Cases
#### Best for Paid Advertising Campaigns
**Unbounce** wins here. Smart Traffic, dynamic text replacement, and server-side A/B testing are built specifically for PPC optimization. The ROI on even a single percentage point of conversion improvement typically covers the subscription cost many times over.
#### Best for E-commerce and Shopify Stores
This means your landing pages can feed captured leads into automated email and SMS flows that reference actual products the customer has browsed or purchased. Instead of generic follow-up sequences, you get personalized product recommendations and targeted offers based on real store behavior.
#### Best for Bootstrapped Startups
**MailerLite** or **Carrd** depending on your needs. MailerLite gives you landing pages plus email marketing in one workflow. Carrd gives you one of the fastest and simplest ways to launch a focused page.
#### Best for Agencies
**Instapage** is purpose-built for agency workflows. Client sub-accounts, real-time collaboration, and the AdMap feature make managing landing pages across multiple clients significantly easier than with any other tool.
#### Best for All-in-One Marketing
**Brevo** offers the broadest feature set relative to platform complexity. Landing pages, email, SMS, WhatsApp, CRM, and marketing automation live in a single system. For businesses that want to consolidate tools rather than manage separate subscriptions, Brevo eliminates integration friction.
#### Best for Complete Beginners
**Wix** has the gentlest learning curve and the most hand-holding through the page creation process. The AI Design Intelligence feature can generate a complete page layout from a few text prompts, which removes the blank-canvas intimidation that stops many beginners.
Decision: What are your landing pages for?
- If Paid advertising: Unbounce (Smart Traffic, dynamic text replacement and server-side A/B testing.)
- If Bootstrapped startup: MailerLite or Carrd (Pages plus email in one workflow, or the fastest focused page.)
- If Agency work: Instapage (Client sub-accounts, real-time collaboration and AdMap.)
- If Complete beginner: Wix (The gentlest learning curve and AI-generated layouts.)
### Final Thoughts
The best landing page builder depends on what you are optimizing for. If it is pure conversion performance, choose Unbounce. If it is simplicity and affordability, choose Carrd or MailerLite. If it is an integrated marketing stack that connects landing pages to email, SMS, CRM, and automation, choose Brevo.
What matters most is not which tool you pick, but that you actually build and test landing pages for your campaigns. A landing page built with any tool on this list will outperform sending paid traffic to a generic homepage. Start with whichever builder fits your budget and skill level, launch your first page, and optimize from there.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**What is a landing page?**
A landing page is a standalone web page designed for a specific marketing campaign or offer. Unlike regular pages, it has a single focused CTA and removes navigation to minimize distractions and maximize conversions.
**What makes a high-converting landing page?**
Key elements include a clear offer, message match with the ad or email that sent the visitor, credible proof, one primary CTA, fast mobile performance, and a form that asks only for data the team will use.
**Do I need a landing page builder?**
Use a landing page builder when marketers need to launch campaign pages without waiting on engineering. A full website builder can work for simple pages, but dedicated landing page tools usually add forms, A/B testing, dynamic text, analytics, and ad workflow features.
**What is a landing page builder?**
A landing page builder is a software tool that lets you create standalone web pages designed for a specific marketing goal, typically capturing leads or driving a particular action. Unlike general website builders, landing page builders include features specifically optimized for conversions such as A/B testing, form builders, and analytics.
**Can I build a landing page for free?**
Yes. Several tools offer free landing page builder plans or trial paths, including Carrd, MailerLite, Brevo, Wix, ConvertFlow, and Landingi. Free plans typically include tool branding, subdomains, visitor limits, page limits, or limited integrations.
**Do I need a landing page builder if I have a website?**
In most cases, yes. Your main website serves a different purpose than a landing page. Websites provide broad information across many pages, while landing pages focus visitors on a single action. Dedicated landing page builders also include conversion-specific features like A/B testing and dynamic content that most website platforms lack.
**What is the difference between a landing page and a homepage?**
A homepage is the main entry point to your website with navigation links, multiple sections, and various calls-to-action. A landing page has a single focus, no navigation menu, and one clear call-to-action. Landing pages consistently convert at higher rates because they eliminate distractions and match visitor intent from a specific ad or campaign.
**Which landing page builder has the best free plan?**
MailerLite is usually the most useful free entry path for marketers who also need email. Carrd is strongest for simple single-page sites. Brevo is the better fit when the landing page must connect to email automation, SMS, CRM, or ecommerce data.
**How many landing pages do I need?**
Create one focused landing page per campaign, offer, or audience segment. Quality matters more than raw page count: start with the campaigns that already drive traffic, then expand when you can maintain message match, testing, and follow-up for each page.
---
## Live Chat Software Guide: Support Channels, AI, Routing, Pricing Models, and Fit (2026)
Source: https://tajo.io/blog/best-live-chat-software/
Published: 2026-03-22 · Updated: 2026-05-25
Compare live chat software by widget quality, AI, routing, unified inboxes, ecommerce context, pricing model, and support workflow fit using current market signals.
Summary: Choose live chat software by workflow. Brevo Conversations fits teams that want chat tied to email, SMS, WhatsApp, CRM, and automation. LiveChat is strong for polished standalone chat, Zendesk for enterprise support, Intercom for SaaS engagement, and Tidio for ecommerce AI.
Adding live chat software to your website gives buyers and customers a faster path to answers. The impact depends on placement, staffing, routing, automation quality, and how well the conversation connects to your CRM, helpdesk, ecommerce data, or marketing stack.
But not every live chat tool is the same. Some are lightweight chat widgets built for small teams. Others are full customer communication platforms with AI chatbots, ticketing, and multi-channel capabilities. Choosing the wrong one means paying for features you do not need, or worse, outgrowing your tool within months.
The comparison below covers live chat tools by widget quality, AI, routing, inbox coverage, ecommerce context, pricing model, and ideal use case.
### Quick Comparison: Best Live Chat Software
| Tool | Free or trial path | Pricing model to verify | AI/chatbot depth | Best fit |
|------|--------------------|-------------------------|------------------|----------|
| **LiveChat** | Trial path | Seat tiers, add-ons, chatbot product | Strong with add-ons | Mid-size support teams |
| **Zendesk** | Trial path | Suite tiers, agent seats, AI add-ons | Strong | Enterprise support |
| **Brevo Conversations** | Free entry path | Conversations tier, seats, chatbot, broader Brevo plan | Practical | All-in-one marketing plus chat |
| **Intercom** | Trial path | Seats, usage, Fin AI resolutions, product features | Very strong | Product-led SaaS |
| **tawk.to** | Free-first | Branding removal, hired agents, add-ons | Limited | Budget-conscious teams |
| **Tidio** | Free entry path | Operator seats, AI conversations, ecommerce features | Strong for SMB ecommerce | Small ecommerce |
| **Olark** | Trial path | Seat plan plus PowerUps | Basic to moderate | Simple setup |
| **Freshchat** | Free entry path | Agents, automation, AI, Freshworks suite tier | Strong | Growing startups |
| **HubSpot Live Chat** | Free entry path | Hub tier, seats, branding, automation | Good in HubSpot | HubSpot CRM users |
| **Drift** | Enterprise sales motion | Revenue platform package, routing, sales integrations | Strong for B2B | B2B revenue teams |
### Why Live Chat Matters for Your Website
Live chat is no longer a nice-to-have feature, it is a competitive requirement. Here is why businesses across every industry are investing in customer chat software:
#### Faster Response Times Drive Conversions
Live chat shortens the time between a visitor's question and the answer that lets them move forward. That speed matters most on pricing pages, checkout flows, onboarding screens, and product pages where a delay can turn into abandonment.
#### Lower Support Costs
A trained live chat agent can usually handle multiple simple conversations at once, while phone support stays one-to-one. The cost benefit depends on queue volume, issue complexity, canned responses, AI assistance, and escalation rules.
#### Higher Customer Satisfaction
Live chat can improve customer satisfaction when it is staffed and routed well. Customers appreciate the convenience, speed, and ability to multitask, but a slow or poorly automated chat widget can damage trust just as quickly.
#### Revenue Generation
Live chat is not just a support tool. When placed strategically on pricing pages, checkout flows, and product pages, a website chat widget becomes a proactive sales channel. Agents can address objections in real time, recommend products, and guide visitors toward a purchase.
---
### What to Look for in Live Chat Software
Before comparing tools, understand the features that separate great live chat software from basic options:
#### Essential Features
1. **Customizable Chat Widget**, Match your brand colors, position, and style
2. **Canned Responses**, Pre-written replies for common questions to speed up resolution
3. **Visitor Tracking**, See which pages visitors are on, their location, and referral source
4. **File Sharing**, Exchange screenshots, documents, and images within the chat
5. **Mobile App**, Respond to chats from your phone when away from your desk
6. **Chat Routing**, Automatically direct conversations to the right department or agent
7. **Offline Messages**, Capture leads when no agents are available
#### Advanced Features
- **AI Chatbot**, Automate answers to repetitive questions and qualify leads 24/7
- **Multi-Channel Inbox**, Manage chat, email, SMS, and social messages in one place
- **CRM Integration**, Sync chat conversations with your customer database
- **Proactive Chat Triggers**, Automatically start conversations based on visitor behavior
- **Analytics and Reporting**, Track chat volume, response times, satisfaction scores, and conversion impact
- **E-commerce Integration**, See cart contents, order history, and customer data during chats
---
### The 10 Best Live Chat Software for Websites
#### 1. LiveChat, Best for Mid-Size Support Teams
**Best for:** Teams that need a polished, reliable live chat tool with strong integrations
LiveChat has been a market leader in live chat software since 2002, and it remains one of the most refined options available. The platform focuses specifically on chat, it does not try to be an all-in-one CRM or helpdesk, and that focus shows in the quality of the chat experience.
##### Key Features
- **Sneak Peek**, See what visitors are typing before they send the message
- **Chat Tags and Categories**, Organize conversations for reporting and routing
- **200+ Integrations**, Connect with Shopify, WordPress, Salesforce, HubSpot, and more
- **AI Assist**, AI-generated reply suggestions and conversation summaries
- **Rich Messages**, Send product cards, carousels, and interactive buttons within chat
- **Chat Transfer**, Seamlessly hand off conversations between agents
##### Pricing model
LiveChat pricing depends on agent seats, plan tier, chat history, reporting, routing, and whether you need separate chatbot or helpdesk products. Verify the current tier that includes the integrations and AI features you need.
##### Strengths
LiveChat excels at the core chat experience. The widget is fast-loading, highly customizable, and looks professional on any website. Reporting is detailed, and the integration ecosystem is one of the largest in the industry.
##### Limitations
The AI chatbot and broader multi-channel support can require additional LiveChat products or add-ons. Confirm the total stack cost if you need chat, bots, ticketing, and social messaging together.
---
#### 2. Zendesk, Best for Enterprise Support Operations
**Best for:** Large companies that need live chat as part of a comprehensive support suite
Zendesk is a full-service customer support platform, and its live chat feature (formerly Zopim) is deeply integrated with its ticketing, knowledge base, and AI capabilities. If you already use Zendesk for support or plan to build a robust helpdesk, its chat functionality is a natural extension.
##### Key Features
- **Unified Agent Workspace**, Chat, email, phone, and social messages in one interface
- **AI-Powered Bots**, Automate up to 80% of common inquiries with Zendesk AI
- **Proactive Messaging**, Trigger chats based on page views, time on site, or cart value
- **Advanced Routing**, Skills-based, round-robin, and capacity-based chat assignment
- **Multilingual Support**, Auto-detect visitor language and route accordingly
- **SLA Management**, Set response time targets and track compliance
##### Pricing model
Zendesk pricing depends on suite tier, agent seats, AI add-ons, self-service, analytics, routing, and enterprise controls. Verify whether chat, bots, help center, SLA management, and reporting are all included in the tier you plan to buy.
##### Strengths
Zendesk offers unmatched depth for enterprise teams. The AI capabilities are strong, the analytics are granular, and the platform scales to hundreds of agents without performance issues.
##### Limitations
The pricing can add up fast once AI, analytics, and enterprise support features enter the plan. The platform can feel overwhelming for small teams, and setup requires meaningful configuration time. Chat-only users may find they are paying for a lot of features they do not use.
---
#### 3. Brevo Conversations, Best Value All-in-One Platform
**Best for:** Businesses that want live chat, email marketing, SMS, and CRM in a single platform
Brevo Conversations stands apart from pure live chat tools because it is part of the broader Brevo platform, which includes email marketing, SMS, WhatsApp, CRM, and marketing automation. This means your live chat conversations are not siloed. Every chat interaction feeds directly into your customer profiles, email segments, and automation workflows.
For businesses tired of juggling separate tools for chat, email, and customer data, Brevo Conversations eliminates that fragmentation.
##### Key Features
- **Free Live Chat Widget**, Fully functional chat widget at no cost
- **Unified Inbox**, Chat, email, Instagram, Facebook Messenger, and WhatsApp in one place
- **Chatbot Builder**, Visual, no-code bot builder for lead qualification and FAQ automation
- **Visitor Tracking**, See what page a visitor is on and their browsing history in real time
- **Contact Integration**, Chat conversations automatically create or update CRM contacts
- **Chat-to-Email Continuity**, If a visitor leaves, the conversation continues via email
- **Mobile App**, Respond to chats on iOS and Android
##### Pricing model
Brevo Conversations has a free entry path and paid conversation features. Verify current chat seats, visitor tracking, chatbot access, inbox channels, and how Conversations interacts with your broader Brevo email, SMS, WhatsApp, and CRM plan.
##### Strengths
Brevo Conversations offers strong value because chat sits inside the broader Brevo ecosystem rather than as an isolated widget. The buyer should verify the current free and paid plan limits, then compare the total cost of replacing separate chat, email, SMS, CRM, and automation tools.
The real advantage is the all-in-one ecosystem. A visitor chats with you today, gets added to your email list, receives a follow-up email campaign tomorrow, and gets an SMS with a discount next week, all from one platform, one contact record, one set of automations.
Sequence, triggered by: Visitor starts a chat
1. Added to your email list
2. Follow-up email campaign
3. SMS with a discount
##### Limitations
The chatbot is capable but not as sophisticated as Intercom's Fin or Zendesk's AI for complex use cases. The chat widget customization options are more limited than LiveChat's.
---
#### 4. Intercom, Best for Product-Led SaaS Companies
**Best for:** SaaS businesses that want chat, product tours, and customer engagement in one platform
Intercom pioneered the modern approach to customer messaging, and it remains the go-to live chat software for SaaS companies. Its strength is combining live chat with product tours, in-app messages, and a powerful AI assistant called Fin that can resolve questions using your help center content.
##### Key Features
- **Fin AI Agent**, AI chatbot that answers questions from your knowledge base with cited sources
- **Custom Bots**, Build qualification and routing bots with a visual editor
- **Product Tours**, Guide users through features with step-by-step walkthroughs
- **In-App Messaging**, Send targeted messages based on user behavior
- **Conversation Intelligence**, AI-generated summaries, sentiment analysis, and topic detection
- **Outbound Messaging**, Proactive email, push, and in-app campaigns
##### Pricing model
Intercom pricing depends on seats, plan tier, product modules, Fin AI usage, outbound messaging, and support automation needs. Verify resolution-based AI costs against your ticket volume before relying on an entry quote.
##### Strengths
Intercom's Fin AI is one of the best AI chatbots available, it genuinely resolves questions rather than just deflecting to help articles. The platform is purpose-built for SaaS user engagement, and the combination of chat, bots, tours, and in-app messaging is unique.
##### Limitations
Intercom can become expensive as seats and AI usage scale. Resolution-based AI pricing can be hard to forecast at high volume. Non-SaaS businesses may find many features irrelevant. The learning curve is steeper than simpler tools.
---
#### 5. tawk.to, Best Free Live Chat Software
**Best for:** Small businesses and startups that need live chat with zero budget
tawk.to is a popular free-first live chat option. The core appeal is unlimited live chat for teams that need a practical widget before they are ready for a paid support suite. The company monetizes through optional services and add-ons such as branding removal and hired agents.
##### Key Features
- **Completely Free**, No limits on agents, chats, or history
- **Knowledge Base**, Built-in help center (also free)
- **Ticketing System**, Convert chats to support tickets
- **Video and Voice Add-On**, Audio and video calling within chat
- **Multi-Site Support**, Manage chat for multiple websites from one dashboard
- **Canned Responses**, Shortcuts for common replies
##### Pricing model
tawk.to's core chat product is free-first, with optional paid services such as branding removal and hired-agent coverage. Verify current add-on pricing and support expectations before building a support process around it.
##### Strengths
You cannot beat the price. For a free tool, the feature set is surprisingly complete, visitor monitoring, file sharing, chat history, and group messaging are all included. Setup takes under 5 minutes.
##### Limitations
The interface looks dated compared to modern alternatives. AI chatbot functionality is basic. The chat widget is not as fast-loading or polished as paid options. Limited customization and reporting capabilities. Some users report occasional reliability issues during peak times.
---
#### 6. Tidio, Best for Small E-commerce Stores
**Best for:** Small online stores that want chat, chatbots, and basic automation
Tidio has carved a strong niche in the small e-commerce market by combining live chat with an AI chatbot called Lyro and pre-built automation templates designed for online stores. It integrates tightly with Shopify, WooCommerce, and other e-commerce platforms.
##### Key Features
- **Lyro AI Chatbot**, Learns from your FAQ content to answer customer questions automatically
- **Pre-Built E-commerce Bots**, Templates for abandoned cart recovery, order status, and product recommendations
- **Live Visitor List**, See who is browsing your store in real time
- **Shopify Integration**, View order history and cart contents during chats
- **Multi-Channel**, Chat, email, and Instagram DMs in one inbox
- **Visual Bot Builder**, Drag-and-drop chatbot editor
##### Pricing model
Tidio pricing depends on operators, AI conversation volume, ecommerce features, analytics, and custom quotas. Verify the current Lyro AI allowance and the plan jump that applies when chat or automation volume grows.
##### Strengths
Tidio is specifically designed for e-commerce, and it shows. The pre-built bot templates handle common online store scenarios out of the box. Lyro AI is impressive for the price, it can handle product questions, sizing inquiries, and order tracking without human intervention.
##### Limitations
The free tier and AI usage allowances need close review. Pricing can get complicated when operator seats, AI conversations, and advanced customization are billed separately.
---
#### 7. Olark, Best for Simple, Straightforward Live Chat
**Best for:** Small to mid-size teams that want a clean, easy-to-use live chat tool
Olark keeps things simple. It is a focused live chat tool with solid core features, transparent pricing, and a chat widget that is easy to install and customize. There are no complex bot builders or multi-channel features to configure, just reliable live chat that works.
##### Key Features
- **Customizable Chat Box**, Match colors, shape, and position to your brand
- **Automation Rules**, Auto-greet visitors, route chats, and trigger messages based on behavior
- **Visitor Insights**, See location, browsing history, and referral source
- **Searchable Transcripts**, Full chat history with search and filtering
- **Team Management**, Monitor agent activity, set chat limits, and review performance
- **PowerUps**, Optional add-ons for co-browsing, live visitor translation, and visitor details
##### Pricing model
Olark pricing depends on seat count and optional PowerUps such as co-browsing, translation, and visitor details. Verify the add-ons you need before comparing it with bundled platforms.
##### Strengths
Olark is refreshingly simple in a market full of bloated platforms. Setup takes minutes, the interface is intuitive, and the pricing is transparent. It is a great fit for teams that just need live chat without the upsell pressure toward AI bots and marketing automation.
##### Limitations
Limited AI capabilities compared to competitors. No built-in email or social channel support. PowerUps can add cost quickly. The product has not evolved as rapidly as competitors in recent years.
---
#### 8. Freshchat, Best for Growing Startups
**Best for:** Fast-growing companies that need an affordable chat tool that scales with AI
Freshchat (part of the Freshworks suite) offers a generous free plan and AI capabilities powered by Freddy AI. It is positioned between basic free tools and enterprise platforms, making it a smart choice for startups and growing teams that will need more features over time.
##### Key Features
- **Freddy AI**, AI-powered chatbot and agent assist for faster resolutions
- **Unified Inbox**, Chat, email, social, and messaging apps in one place
- **IntelliAssign**, Automatic chat assignment based on agent skills and workload
- **Campaigns**, Proactive messages triggered by user behavior or events
- **Multilingual Support**, 33+ languages with auto-translation
- **Freshworks Integration**, Connects with Freshdesk, Freshsales, and Freshmarketer
##### Pricing model
Freshchat pricing depends on agent seats, automation depth, Freddy AI, assignment rules, reporting, and Freshworks suite requirements. Verify whether your chat, email, social, and helpdesk needs require adjacent Freshworks products.
##### Strengths
Freshchat's free entry path can be generous for lean teams, and Freddy AI provides a natural upgrade path as your needs grow. The Freshworks ecosystem is strongest when you also need helpdesk, sales, or marketing tools.
##### Limitations
Some advanced features like auto-resolve and advanced automations require Pro or Enterprise plans. The chat widget can be slow to load on some websites. Integration options outside the Freshworks ecosystem are more limited.
---
#### 9. HubSpot Live Chat, Best for HubSpot CRM Users
**Best for:** Businesses already using HubSpot CRM who want integrated live chat
HubSpot Live Chat is part of HubSpot's free CRM platform. If you already use HubSpot for marketing, sales, or support, adding live chat requires zero additional setup, conversations automatically link to contact records, deals, and tickets.
##### Key Features
- **Free Forever**, Included with HubSpot's free CRM
- **ChatFlows**, Build chatbots with a visual editor (no code required)
- **CRM Integration**, Every chat automatically logs to the contact timeline
- **Slack Integration**, Receive and respond to chats from Slack
- **Meeting Booking**, Let visitors schedule meetings directly through chat
- **Chat Routing**, Direct conversations to specific team members based on rules
##### Pricing model
HubSpot Live Chat pricing depends on the Service or broader HubSpot tier, seats, branding, automation, chatbot features, reporting, and CRM needs. Verify which chat features are available in the free and starter tiers versus higher hubs.
##### Strengths
If you use HubSpot, the live chat integration is seamless and powerful. Chat conversations automatically enrich contact records, and the chatbot can qualify leads, book meetings, and create support tickets, all without leaving the chat widget.
##### Limitations
Outside the HubSpot ecosystem, the live chat feels limited. Branding removal, advanced chatbot features, and reporting can require paid or higher-tier hubs, so verify the full HubSpot plan before selecting it only for chat.
---
#### 10. Drift, Best for B2B Revenue Teams
**Best for:** B2B companies focused on using live chat for pipeline generation
Drift (now part of Salesloft) focuses specifically on using live chat as a revenue tool. Unlike support-oriented chat tools, Drift is built for B2B sales teams that want to capture, qualify, and route leads through conversational marketing. Its AI chatbot can book meetings, qualify prospects, and alert sales reps in real time.
##### Key Features
- **Revenue Orchestration**, Route high-value visitors directly to their assigned sales rep
- **AI Chatbot**, Conversational AI that qualifies leads and books meetings automatically
- **Account-Based Targeting**, Show personalized chat experiences to target accounts
- **Fastlane**, Let qualified leads skip forms and book meetings instantly
- **Video Messaging**, Record and send personalized video messages within chat
- **Salesforce Integration**, Deep, bi-directional sync with Salesforce CRM
##### Pricing model
Drift pricing is enterprise-oriented and depends on revenue orchestration, routing, sales integrations, account-based targeting, and contract scope. It is usually evaluated as a sales-platform purchase rather than a simple website chat widget.
##### Strengths
Drift is purpose-built for B2B pipeline generation, and no other tool matches its depth in that category. The ability to identify target accounts, route them to the right rep, and book meetings through AI-powered conversations is genuinely valuable for sales-driven organizations.
##### Limitations
Drift is out of reach for many small and mid-size businesses because it is not designed as a basic support widget. It is not a traditional ticketing system or knowledge base. The platform is complex to set up and optimize, and ROI depends heavily on having a mature B2B sales process.
---
### Best Live Chat Software by Use Case
Choosing live chat software depends less on which tool has the most features and more on which tool fits your specific needs. Here is a breakdown by use case:
#### Best Free Live Chat Software
**tawk.to** for unlimited free agents. **Brevo Conversations** if you also want email marketing and CRM capabilities in the free plan. **HubSpot Live Chat** if you already use HubSpot CRM.
#### Best for E-commerce
**Brevo Conversations** for stores that want unified marketing and chat. **Tidio** for small Shopify and WooCommerce stores that want AI-powered product recommendations. **LiveChat** for larger stores that need deep integrations and polished chat experiences.
#### Best for SaaS Companies
**Intercom** for product-led growth with in-app messaging and AI. **Freshchat** for SaaS startups watching their budget. **Drift** for B2B SaaS focused on pipeline generation.
#### Best for Enterprise
**Zendesk** for large support operations with complex routing needs. **Intercom** for enterprise SaaS with advanced AI requirements. **Drift** for enterprise B2B sales teams.
#### Best All-in-One Solution
**Brevo Conversations** combines live chat, email marketing, SMS, WhatsApp, and CRM in a single platform at a fraction of the cost of assembling separate tools. For businesses that want to consolidate their customer communication stack, it is the clear winner.
---
### Final Verdict
There is no single best live chat software, the right choice depends on your team size, budget, and what else you need beyond chat.
For most businesses, **Brevo Conversations** offers the best combination of value, features, and flexibility. You get a free live chat widget, a unified inbox for chat, email, and social, plus access to Brevo's full marketing platform including email campaigns, SMS, WhatsApp, CRM, and automation. No other tool on this list delivers that breadth at that price point.
If you need the most polished standalone chat experience, go with **LiveChat**. If you are a SaaS company building product-led growth, choose **Intercom**. If you are an enterprise with complex support needs, **Zendesk** is the safe bet. And if budget is your primary concern, **tawk.to** gives you unlimited free chat with no strings attached.
Decision: What do you need beyond chat?
- If Email, SMS, WhatsApp and CRM too: Brevo Conversations (Chat inside a full marketing platform.)
- If The most polished standalone chat: LiveChat (Fast widget, detailed reporting, 200+ integrations.)
- If Product-led SaaS: Intercom (Chat, Fin AI, product tours and in-app messaging.)
- If Complex enterprise support: Zendesk (Ticketing, routing and SLA management at scale.)
- If Nothing; budget comes first: tawk.to (Unlimited free chat.)
Whatever you choose, the data is clear: adding live chat to your website will improve customer satisfaction, reduce response times, and increase conversions. The best time to start is today.
### Where Tajo fits
Tajo is an integration builder. Build integrations. Put agents on them. Let them run engagement. Tajo is in early access. [Request early access](/#early-access)
### Frequently asked questions
**Which live chat software should a website compare in 2026?**
Shortlist LiveChat for polished standalone chat, Zendesk for support suites, Brevo Conversations for marketing plus chat, Intercom for product-led SaaS, Tidio for ecommerce AI, Freshchat for growing teams, HubSpot for CRM-driven teams, and tawk.to for a free-first chat workflow.
**Are free live chat tools good enough?**
Yes, many live chat software offer free plans or free tiers with limited features. These are great for small businesses or individuals getting started.
**How do I choose the right live chat software?**
Start with the workflow: support-only chat, sales-assisted conversion, ecommerce context, SaaS onboarding, or all-in-one customer communication. Then compare routing, AI handoff, CRM sync, inbox channels, mobile apps, and whether pricing follows seats, usage, contacts, or support-suite tiers.
**What is live chat software?**
Live chat software adds a chat widget to your website that lets visitors communicate with your team in real time. Modern live chat tools also include AI chatbots, automation, visitor tracking, and integrations with CRM and helpdesk platforms.
**Is free live chat software good enough?**
For small businesses and startups, yes. Tools like tawk.to, Brevo Conversations, and HubSpot Live Chat offer solid free plans that handle basic chat needs. You will want to upgrade to a paid plan when you need AI chatbots, advanced automation, or detailed analytics.
**How does live chat increase conversions?**
Live chat lets you answer questions in real time when visitors are actively considering a purchase. By removing friction and addressing objections on pricing pages, product pages, and checkout flows, chat can improve conversion when it is staffed, routed, and measured properly.
**Can live chat replace phone and email support?**
Live chat complements phone and email rather than replacing them. Many customers prefer chat for quick questions, but complex issues may still require phone or email. The best approach is offering all channels through a unified inbox so customers can choose their preferred method.
**What is the difference between live chat and a chatbot?**
Live chat connects visitors with human agents in real time. A chatbot uses AI or pre-programmed rules to respond automatically. Most modern live chat software includes both, chatbots handle routine questions 24/7 and hand off complex issues to human agents during business hours.
**How many chats can one agent handle at a time?**
An experienced agent can typically handle 3 to 5 concurrent conversations, depending on complexity. AI-assisted tools that suggest responses and automate routine tasks can push this number higher. Most platforms let you set maximum concurrent chat limits per agent to prevent overload.
**How do I add live chat to my website?**
Most live chat software provides a JavaScript snippet that you paste into your website's HTML, usually just before the closing `