Published by January 28, 2025 · Reading time 8 minutes · Created by William
Les agences et équipes marketing gèrent souvent plusieurs projets EchoTag simultanément. Découvrez comment organiser efficacement votre équipe, gérer les permissions et collaborer sur plusieurs projets sans perdre le contrôle.
// Configuration multi-projets pour agence
const agencyStructure = {
organization: {
name: "Digital Marketing Agency",
slug: "digital-agency",
plan: "business",
maxMembers: 10,
maxProjects: 50,
},
projects: {
clientA: {
name: "E-commerce Fashion",
slug: "fashion-store",
members: ["admin", "analyst", "developer"],
permissions: {
admin: ["read", "write", "delete", "manage_users"],
analyst: ["read", "write"],
developer: ["read", "write", "api_access"],
},
},
clientB: {
name: "SaaS B2B",
slug: "saas-platform",
members: ["admin", "marketing"],
permissions: {
admin: ["read", "write", "delete", "manage_users"],
marketing: ["read", "write"],
},
},
},
};
// Définition des rôles EchoTag
const echoTagRoles = {
owner: {
name: "Propriétaire",
description: "Accès complet à tous les projets",
permissions: [
"manage_organization",
"manage_billing",
"manage_users",
"manage_projects",
"full_access",
],
},
admin: {
name: "Administrateur",
description: "Gestion complète d'un projet",
permissions: [
"manage_project",
"manage_triggers",
"manage_integrations",
"view_analytics",
"manage_tags",
],
},
analyst: {
name: "Analyste",
description: "Analyse des données et création de triggers",
permissions: [
"view_analytics",
"create_triggers",
"view_tags",
"export_data",
],
},
developer: {
name: "Développeur",
description: "Intégration technique et API",
permissions: [
"view_analytics",
"manage_integrations",
"api_access",
"manage_webhooks",
],
},
viewer: {
name: "Lecteur",
description: "Consultation des données uniquement",
permissions: ["view_analytics", "view_triggers", "view_tags"],
},
};
// Invitation d'un nouveau membre
const inviteTeamMember = async (invitationData) => {
const response = await fetch(`${API_BASE_URL}/organizations/invitations`, {
method: "POST",
headers: headers,
body: JSON.stringify({
organization_id: "org_abc123",
email: invitationData.email,
role: invitationData.role,
projects: invitationData.projects,
message: invitationData.message,
}),
});
return response.json();
};
// Exemple d'invitation
const invitation = await inviteTeamMember({
email: "analyst@agency.com",
role: "analyst",
projects: ["proj_fashion", "proj_saas"],
message: "Bienvenue dans l'équipe EchoTag !",
});
// Configuration des permissions par projet
const projectPermissions = {
projectId: "proj_fashion",
members: [
{
userId: "user_123",
role: "admin",
permissions: ["read", "write", "delete", "manage_users"],
},
{
userId: "user_456",
role: "analyst",
permissions: ["read", "write"],
},
{
userId: "user_789",
role: "developer",
permissions: ["read", "write", "api_access"],
},
],
};
// Mettre à jour les permissions
const updatePermissions = async (projectId, userId, newPermissions) => {
const response = await fetch(
`${API_BASE_URL}/projects/${projectId}/members/${userId}`,
{
method: "PATCH",
headers: headers,
body: JSON.stringify({
permissions: newPermissions,
}),
},
);
return response.json();
};
// Dashboard multi-projets
const multiProjectDashboard = {
overview: {
totalProjects: 8,
activeProjects: 6,
totalMembers: 12,
totalEvents: 1250000,
totalConversions: 2340,
},
projects: [
{
id: "proj_fashion",
name: "E-commerce Fashion",
status: "active",
events: 450000,
conversions: 890,
conversionRate: 0.2,
members: 4,
lastActivity: "2025-01-28T10:30:00Z",
},
{
id: "proj_saas",
name: "SaaS B2B Platform",
status: "active",
events: 320000,
conversions: 156,
conversionRate: 0.05,
members: 3,
lastActivity: "2025-01-28T09:15:00Z",
},
],
alerts: [
{
type: "high_traffic",
project: "proj_fashion",
message: "Trafic anormalement élevé détecté",
severity: "warning",
},
{
type: "conversion_drop",
project: "proj_saas",
message: "Baisse de 15% des conversions",
severity: "critical",
},
],
};
// Filtres pour le dashboard multi-projets
const dashboardFilters = {
dateRange: {
start: "2025-01-01",
end: "2025-01-28",
},
projects: ["proj_fashion", "proj_saas"],
metrics: ["events", "conversions", "revenue"],
status: "active",
};
// Recherche avancée
const searchProjects = async (searchCriteria) => {
const params = new URLSearchParams({
query: searchCriteria.query,
status: searchCriteria.status,
member: searchCriteria.member,
date_from: searchCriteria.dateFrom,
date_to: searchCriteria.dateTo,
});
const response = await fetch(`${API_BASE_URL}/projects/search?${params}`, {
method: "GET",
headers: headers,
});
return response.json();
};
// Workflow de validation des triggers
const triggerValidationWorkflow = {
steps: [
{
name: "Création",
role: "analyst",
action: "create_trigger",
required: true,
},
{
name: "Review technique",
role: "developer",
action: "review_trigger",
required: true,
autoApprove: false,
},
{
name: "Validation client",
role: "admin",
action: "approve_trigger",
required: true,
notifyClient: true,
},
{
name: "Déploiement",
role: "developer",
action: "deploy_trigger",
required: true,
},
],
notifications: {
onStepComplete: true,
onWorkflowComplete: true,
clientNotifications: true,
},
};
// Système de templates partagés
const sharedTemplates = {
organization: "org_abc123",
templates: [
{
name: "Cart Abandonment Recovery",
category: "e-commerce",
createdBy: "user_123",
sharedWith: ["user_456", "user_789"],
usage: {
totalUses: 15,
successRate: 0.78,
averageROI: 340,
},
},
{
name: "SaaS User Activation",
category: "saas",
createdBy: "user_456",
sharedWith: ["user_123", "user_789"],
usage: {
totalUses: 8,
successRate: 0.85,
averageROI: 280,
},
},
],
};
// Partager un template
const shareTemplate = async (templateId, members) => {
const response = await fetch(
`${API_BASE_URL}/templates/${templateId}/share`,
{
method: "POST",
headers: headers,
body: JSON.stringify({
members: members,
permissions: ["read", "use", "modify"],
}),
},
);
return response.json();
};
// Rapport consolidé multi-projets
const consolidatedReport = {
period: "2025-01",
projects: ["proj_fashion", "proj_saas", "proj_blog"],
metrics: {
totalEvents: 1250000,
totalVisitors: 89000,
totalConversions: 2340,
averageConversionRate: 0.026,
totalRevenue: 156000,
},
performance: {
topPerformingProject: "proj_fashion",
mostImprovedProject: "proj_saas",
bestROI: "proj_blog",
},
teamActivity: {
totalTriggersCreated: 45,
totalIntegrationsSetup: 23,
totalReportsGenerated: 67,
mostActiveMember: "user_123",
},
};
// Configuration des alertes multi-projets
const multiProjectAlerts = {
alerts: [
{
name: "Conversion Drop Alert",
condition: "conversion_rate < 0.02",
projects: ["proj_fashion", "proj_saas"],
recipients: ["admin@agency.com", "analyst@agency.com"],
frequency: "hourly",
},
{
name: "High Traffic Alert",
condition: "events_per_hour > 10000",
projects: ["*"],
recipients: ["admin@agency.com"],
frequency: "immediate",
},
{
name: "New Lead Alert",
condition: "lead_score > 80",
projects: ["proj_saas"],
recipients: ["sales@agency.com"],
frequency: "immediate",
},
],
escalation: {
enabled: true,
levels: [
{ delay: "15_minutes", recipients: ["analyst@agency.com"] },
{ delay: "1_hour", recipients: ["admin@agency.com"] },
{ delay: "4_hours", recipients: ["manager@agency.com"] },
],
},
};
// Système de commentaires sur les triggers
const triggerComments = {
triggerId: "trig_abc123",
comments: [
{
id: "com_001",
author: "user_123",
content:
"Ce trigger semble trop agressif, je suggère d'augmenter le délai",
timestamp: "2025-01-28T10:30:00Z",
replies: [
{
id: "rep_001",
author: "user_456",
content: "D'accord, je vais ajuster le délai à 2 heures",
timestamp: "2025-01-28T11:15:00Z",
},
],
},
],
};
// Ajouter un commentaire
const addComment = async (triggerId, comment) => {
const response = await fetch(
`${API_BASE_URL}/triggers/${triggerId}/comments`,
{
method: "POST",
headers: headers,
body: JSON.stringify({
content: comment.content,
mentions: comment.mentions || [],
}),
},
);
return response.json();
};
// Historique des modifications
const changeHistory = {
triggerId: "trig_abc123",
history: [
{
action: "created",
user: "user_123",
timestamp: "2025-01-25T14:30:00Z",
details: "Trigger créé pour récupération panier",
},
{
action: "modified",
user: "user_456",
timestamp: "2025-01-26T09:15:00Z",
details: "Délai modifié de 30min à 1h",
changes: {
before: { delay: 1800000 },
after: { delay: 3600000 },
},
},
{
action: "activated",
user: "user_123",
timestamp: "2025-01-26T10:00:00Z",
details: "Trigger activé en production",
},
],
};
// Convention de nommage pour agences
const projectNamingConvention = {
pattern: "client-name-project-type",
examples: [
"fashion-store-ecommerce",
"saas-platform-b2b",
"blog-content-marketing",
],
tags: {
client: "fashion-store",
type: "ecommerce",
status: "active",
priority: "high",
},
};
// Politique d'accès pour agences
const accessPolicy = {
onboarding: {
newClient: [
"create_project",
"invite_client_user",
"setup_basic_triggers",
"configure_analytics",
],
newTeamMember: ["assign_role", "grant_project_access", "provide_training"],
},
offboarding: {
clientLeaving: ["export_data", "transfer_ownership", "archive_project"],
teamMemberLeaving: [
"revoke_access",
"transfer_responsibilities",
"update_documentation",
],
},
};
// Système de reporting client
const clientReporting = {
frequency: "weekly",
recipients: ["client@example.com"],
content: {
metrics: ["conversions", "revenue", "traffic"],
insights: ["top_performers", "improvement_opportunities"],
actions: ["recommendations", "next_steps"],
},
automation: {
generateReport: true,
sendEmail: true,
scheduleMeeting: false,
},
};
// Audit trail complet
const auditTrail = {
organization: "org_abc123",
period: "2025-01",
events: [
{
action: "user_login",
user: "user_123",
timestamp: "2025-01-28T10:30:00Z",
ip: "192.168.1.100",
userAgent: "Chrome/120.0.0.0",
},
{
action: "trigger_modified",
user: "user_456",
timestamp: "2025-01-28T11:15:00Z",
resource: "trig_abc123",
changes: ["delay", "conditions"],
},
{
action: "data_exported",
user: "user_123",
timestamp: "2025-01-28T12:00:00Z",
resource: "proj_fashion",
format: "csv",
},
],
};
// Contrôles de sécurité
const securityControls = {
authentication: {
mfa: true,
sessionTimeout: 3600,
maxFailedAttempts: 5,
},
authorization: {
roleBasedAccess: true,
projectBasedPermissions: true,
apiKeyRotation: "monthly",
},
dataProtection: {
encryption: "AES-256",
dataRetention: "2_years",
gdprCompliance: true,
},
};
// Métriques de performance équipe
const teamPerformanceMetrics = {
productivity: {
triggersCreated: 45,
integrationsSetup: 23,
reportsGenerated: 67,
averageResponseTime: "2_hours",
},
quality: {
triggerSuccessRate: 0.85,
integrationUptime: 0.99,
clientSatisfaction: 4.8,
},
efficiency: {
timeToSetup: "3_days",
timeToOptimize: "1_week",
automationCoverage: 0.78,
},
};
La gestion multi-projets avec EchoTag permet aux agences et équipes de collaborer efficacement tout en maintenant le contrôle et la sécurité. Avec les bons outils et processus, vous pouvez gérer plusieurs projets simultanément sans perdre en qualité ou en efficacité.
Prochaines étapes :
Ressources :
Prêt à gérer vos projets en équipe ? Commencez avec EchoTag.