Skip to content

Commit 66d49d7

Browse files
committed
2 parents cef8bc2 + 21d5f55 commit 66d49d7

12 files changed

Lines changed: 410 additions & 434 deletions

File tree

Lines changed: 32 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,52 @@
1+
import type { Automation } from '@objectstack/spec';
2+
type Flow = Automation.Flow;
3+
14
/** Campaign Enrollment — scheduled flow to bulk enroll leads */
2-
export const CampaignEnrollmentFlow = {
5+
export const CampaignEnrollmentFlow: Flow = {
36
name: 'campaign_enrollment',
47
label: 'Enroll Leads in Campaign',
58
description: 'Bulk enroll leads into marketing campaigns',
6-
type: 'autolaunched',
7-
triggerType: 'scheduled',
8-
schedule: '0 9 * * 1', // Monday at 9am
9+
type: 'schedule',
910

1011
variables: [
1112
{ name: 'campaignId', type: 'text', isInput: true, isOutput: false },
1213
{ name: 'leadStatus', type: 'text', isInput: true, isOutput: false },
1314
],
1415

15-
steps: [
16+
nodes: [
17+
{ id: 'start', type: 'start', label: 'Start (Monday 9 AM)', config: { schedule: '0 9 * * 1' } },
18+
{
19+
id: 'get_campaign', type: 'get_record', label: 'Get Campaign',
20+
config: { objectName: 'campaign', filter: { id: '{campaignId}' }, outputVariable: 'campaignRecord' },
21+
},
1622
{
17-
id: 'get_campaign',
18-
type: 'record_lookup',
19-
label: 'Get Campaign',
20-
objectName: 'campaign',
21-
filter: { id: '{campaignId}' },
22-
outputVariable: 'campaignRecord',
23+
id: 'query_leads', type: 'get_record', label: 'Find Eligible Leads',
24+
config: { objectName: 'lead', filter: { status: '{leadStatus}', is_converted: false, email: { $ne: null } }, limit: 1000, outputVariable: 'leadList' },
2325
},
2426
{
25-
id: 'query_leads',
26-
type: 'record_query',
27-
label: 'Find Eligible Leads',
28-
objectName: 'lead',
29-
filter: { status: '{leadStatus}', is_converted: false, email: { $ne: null } },
30-
limit: 1000,
31-
outputVariable: 'leadList',
27+
id: 'loop_leads', type: 'loop', label: 'Process Each Lead',
28+
config: { collection: '{leadList}', iteratorVariable: 'currentLead' },
3229
},
3330
{
34-
id: 'loop_leads',
35-
type: 'loop',
36-
label: 'Process Each Lead',
37-
collection: '{leadList}',
38-
itemVariable: 'currentLead',
39-
steps: [
40-
{
41-
id: 'create_campaign_member',
42-
type: 'record_create',
43-
label: 'Add to Campaign',
44-
objectName: 'campaign_member',
45-
fields: {
46-
campaign: '{campaignId}',
47-
lead: '{currentLead.id}',
48-
status: 'sent',
49-
added_date: '{NOW()}',
50-
},
51-
},
52-
],
31+
id: 'create_campaign_member', type: 'create_record', label: 'Add to Campaign',
32+
config: {
33+
objectName: 'campaign_member',
34+
fields: { campaign: '{campaignId}', lead: '{currentLead.id}', status: 'sent', added_date: '{NOW()}' },
35+
},
5336
},
5437
{
55-
id: 'update_campaign_stats',
56-
type: 'record_update',
57-
label: 'Update Campaign Stats',
58-
recordId: '{campaignId}',
59-
objectName: 'campaign',
60-
fields: { num_sent: '{leadList.length}' },
38+
id: 'update_campaign_stats', type: 'update_record', label: 'Update Campaign Stats',
39+
config: { objectName: 'campaign', filter: { id: '{campaignId}' }, fields: { num_sent: '{leadList.length}' } },
6140
},
41+
{ id: 'end', type: 'end', label: 'End' },
42+
],
43+
44+
edges: [
45+
{ id: 'e1', source: 'start', target: 'get_campaign', type: 'default' },
46+
{ id: 'e2', source: 'get_campaign', target: 'query_leads', type: 'default' },
47+
{ id: 'e3', source: 'query_leads', target: 'loop_leads', type: 'default' },
48+
{ id: 'e4', source: 'loop_leads', target: 'create_campaign_member', type: 'default' },
49+
{ id: 'e5', source: 'create_campaign_member', target: 'update_campaign_stats', type: 'default' },
50+
{ id: 'e6', source: 'update_campaign_stats', target: 'end', type: 'default' },
6251
],
6352
};
Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,65 @@
1+
import type { Automation } from '@objectstack/spec';
2+
type Flow = Automation.Flow;
3+
14
/** Case Escalation — auto-escalate high-priority cases */
2-
export const CaseEscalationFlow = {
5+
export const CaseEscalationFlow: Flow = {
36
name: 'case_escalation',
47
label: 'Case Escalation Process',
58
description: 'Automatically escalate high-priority cases',
6-
type: 'autolaunched',
7-
triggerType: 'on_create',
8-
objectName: 'case',
9-
criteria: 'priority = "critical" OR (priority = "high" AND account.type = "customer")',
9+
type: 'record_change',
1010

1111
variables: [
1212
{ name: 'caseId', type: 'text', isInput: true, isOutput: false },
1313
],
1414

15-
steps: [
15+
nodes: [
16+
{
17+
id: 'start', type: 'start', label: 'Start',
18+
config: { objectName: 'case', criteria: 'priority = "critical" OR (priority = "high" AND account.type = "customer")' },
19+
},
1620
{
17-
id: 'get_case',
18-
type: 'record_lookup',
19-
label: 'Get Case Record',
20-
objectName: 'case',
21-
filter: { id: '{caseId}' },
22-
outputVariable: 'caseRecord',
21+
id: 'get_case', type: 'get_record', label: 'Get Case Record',
22+
config: { objectName: 'case', filter: { id: '{caseId}' }, outputVariable: 'caseRecord' },
2323
},
2424
{
25-
id: 'assign_senior_agent',
26-
type: 'record_update',
27-
label: 'Assign to Senior Agent',
28-
recordId: '{caseId}',
29-
objectName: 'case',
30-
fields: {
31-
owner: '{caseRecord.owner.manager}',
32-
is_escalated: true,
33-
escalated_date: '{NOW()}',
25+
id: 'assign_senior_agent', type: 'update_record', label: 'Assign to Senior Agent',
26+
config: {
27+
objectName: 'case', filter: { id: '{caseId}' },
28+
fields: { owner: '{caseRecord.owner.manager}', is_escalated: true, escalated_date: '{NOW()}' },
3429
},
3530
},
3631
{
37-
id: 'create_task',
38-
type: 'record_create',
39-
label: 'Create Follow-up Task',
40-
objectName: 'task',
41-
fields: {
42-
subject: 'Follow up on escalated case: {caseRecord.case_number}',
43-
related_to: '{caseId}',
44-
owner: '{caseRecord.owner}',
45-
priority: 'high',
46-
status: 'not_started',
47-
due_date: '{TODAY() + 1}',
32+
id: 'create_task', type: 'create_record', label: 'Create Follow-up Task',
33+
config: {
34+
objectName: 'task',
35+
fields: {
36+
subject: 'Follow up on escalated case: {caseRecord.case_number}',
37+
related_to: '{caseId}', owner: '{caseRecord.owner}',
38+
priority: 'high', status: 'not_started', due_date: '{TODAY() + 1}',
39+
},
4840
},
4941
},
5042
{
51-
id: 'notify_team',
52-
type: 'email_alert',
53-
label: 'Notify Support Team',
54-
template: 'case_escalated',
55-
recipients: ['{caseRecord.owner}', '{caseRecord.owner.manager}', 'support-team@example.com'],
56-
variables: {
57-
caseNumber: '{caseRecord.case_number}',
58-
priority: '{caseRecord.priority}',
59-
accountName: '{caseRecord.account.name}',
43+
id: 'notify_team', type: 'script', label: 'Notify Support Team',
44+
config: {
45+
actionType: 'email',
46+
template: 'case_escalated',
47+
recipients: ['{caseRecord.owner}', '{caseRecord.owner.manager}', 'support-team@example.com'],
48+
variables: {
49+
caseNumber: '{caseRecord.case_number}',
50+
priority: '{caseRecord.priority}',
51+
accountName: '{caseRecord.account.name}',
52+
},
6053
},
6154
},
55+
{ id: 'end', type: 'end', label: 'End' },
56+
],
57+
58+
edges: [
59+
{ id: 'e1', source: 'start', target: 'get_case', type: 'default' },
60+
{ id: 'e2', source: 'get_case', target: 'assign_senior_agent', type: 'default' },
61+
{ id: 'e3', source: 'assign_senior_agent', target: 'create_task', type: 'default' },
62+
{ id: 'e4', source: 'create_task', target: 'notify_team', type: 'default' },
63+
{ id: 'e5', source: 'notify_team', target: 'end', type: 'default' },
6264
],
6365
};

0 commit comments

Comments
 (0)