Files
simstudioai--sim/apps/sim/triggers/emailbison/utils.ts
T
wehub-resource-sync d25d482dc2
Publish CLI Package / publish-npm (push) Waiting to run
Publish Python SDK / publish-pypi (push) Waiting to run
Publish TypeScript SDK / publish-npm (push) Waiting to run
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

508 lines
27 KiB
TypeScript

import { isRecordLike } from '@sim/utils/object'
import type { SubBlockConfig } from '@/blocks/types'
import type { TriggerOutput } from '@/triggers/types'
export const EMAILBISON_TRIGGER_TO_EVENT_TYPE = {
emailbison_email_sent: 'email_sent',
emailbison_lead_first_contacted: 'lead_first_contacted',
emailbison_lead_replied: 'lead_replied',
emailbison_lead_interested: 'lead_interested',
emailbison_lead_unsubscribed: 'lead_unsubscribed',
emailbison_untracked_reply_received: 'untracked_reply_received',
emailbison_email_opened: 'email_opened',
emailbison_email_bounced: 'email_bounced',
emailbison_email_account_added: 'email_account_added',
emailbison_email_account_removed: 'email_account_removed',
emailbison_email_account_disconnected: 'email_account_disconnected',
emailbison_email_account_reconnected: 'email_account_reconnected',
emailbison_manual_email_sent: 'manual_email_sent',
emailbison_tag_attached: 'tag_attached',
emailbison_tag_removed: 'tag_removed',
emailbison_warmup_disabled_receiving_bounces: 'warmup_disabled_receiving_bounces',
emailbison_warmup_disabled_causing_bounces: 'warmup_disabled_causing_bounces',
} as const
export const emailBisonTriggerOptions = [
{ label: 'Email Sent', id: 'emailbison_email_sent' },
{ label: 'Contact First Emailed', id: 'emailbison_lead_first_contacted' },
{ label: 'Contact Replied', id: 'emailbison_lead_replied' },
{ label: 'Contact Interested', id: 'emailbison_lead_interested' },
{ label: 'Contact Unsubscribed', id: 'emailbison_lead_unsubscribed' },
{ label: 'Untracked Reply Received', id: 'emailbison_untracked_reply_received' },
{ label: 'Email Opened', id: 'emailbison_email_opened' },
{ label: 'Email Bounced', id: 'emailbison_email_bounced' },
{ label: 'Email Account Added', id: 'emailbison_email_account_added' },
{ label: 'Email Account Removed', id: 'emailbison_email_account_removed' },
{ label: 'Email Account Disconnected', id: 'emailbison_email_account_disconnected' },
{ label: 'Email Account Reconnected', id: 'emailbison_email_account_reconnected' },
{ label: 'Manual Email Sent', id: 'emailbison_manual_email_sent' },
{ label: 'Tag Attached', id: 'emailbison_tag_attached' },
{ label: 'Tag Removed', id: 'emailbison_tag_removed' },
{
label: 'Warmup Disabled Receiving Bounces',
id: 'emailbison_warmup_disabled_receiving_bounces',
},
{
label: 'Warmup Disabled Causing Bounces',
id: 'emailbison_warmup_disabled_causing_bounces',
},
]
export function emailBisonSetupInstructions(eventType: string): string {
const instructions = [
'Create an Email Bison API token in <strong>Settings &gt; Developer API</strong>.',
'Enter the <strong>Instance URL</strong> from Email Bison&rsquo;s webhook payload, Full API Reference, or exported Postman collection.',
`Click <strong>Save Configuration</strong> to automatically create an Email Bison webhook for <strong>${eventType}</strong>.`,
'The webhook will be automatically deleted from Email Bison when this trigger is removed.',
]
return instructions
.map(
(instruction, index) =>
`<div class="mb-3"><strong>${index + 1}.</strong> ${instruction}</div>`
)
.join('')
}
export function buildEmailBisonExtraFields(triggerId: string): SubBlockConfig[] {
return [
{
id: 'apiKey',
title: 'API Key',
type: 'short-input',
placeholder: 'Enter your Email Bison API token',
password: true,
required: true,
paramVisibility: 'user-only',
mode: 'trigger',
condition: { field: 'selectedTriggerId', value: triggerId },
},
{
id: 'apiBaseUrl',
title: 'Instance URL',
type: 'short-input',
placeholder: 'https://your-emailbison-workspace.com',
required: true,
paramVisibility: 'user-only',
mode: 'trigger',
condition: { field: 'selectedTriggerId', value: triggerId },
},
]
}
export function buildEmailBisonOutputs(): Record<string, TriggerOutput> {
return {
eventType: { type: 'string', description: 'Email Bison webhook event type' },
eventName: { type: 'string', description: 'Human-readable Email Bison event name' },
instanceUrl: { type: 'string', description: 'Email Bison instance URL' },
workspaceId: { type: 'number', description: 'Email Bison workspace ID' },
workspaceName: { type: 'string', description: 'Email Bison workspace name' },
event: { type: 'json', description: 'Raw Email Bison event metadata object' },
data: { type: 'json', description: 'Raw Email Bison event data object' },
}
}
export function buildEmailBisonEmailSentOutputs(): Record<string, TriggerOutput> {
return {
...buildEmailBisonOutputs(),
scheduledEmail: {
id: { type: 'number', description: 'Scheduled email ID' },
lead_id: { type: 'number', description: 'Lead ID' },
sequence_step_id: { type: 'number', description: 'Sequence step ID' },
sequence_step_order: { type: 'number', description: 'Sequence step order' },
sequence_step_variant: { type: 'number', description: 'Sequence step variant' },
email_subject: { type: 'string', description: 'Email subject' },
email_body: { type: 'string', description: 'Email body HTML' },
status: { type: 'string', description: 'Scheduled email status' },
scheduled_date_est: { type: 'string', description: 'Scheduled date in EST' },
scheduled_date_local: { type: 'string', description: 'Scheduled date in local timezone' },
local_timezone: { type: 'string', description: 'Scheduled email local timezone' },
sent_at: { type: 'string', description: 'Email sent timestamp' },
opens: { type: 'number', description: 'Open count' },
replies: { type: 'number', description: 'Reply count' },
unique_opens: { type: 'number', description: 'Unique open count' },
unique_replies: { type: 'number', description: 'Unique reply count' },
interested: { type: 'string', description: 'Interested status' },
raw_message_id: { type: 'string', description: 'Raw email message ID' },
},
campaignEvent: {
id: { type: 'number', description: 'Campaign event ID' },
event_type: { type: 'string', description: 'Campaign event type' },
created_at_local: { type: 'string', description: 'Campaign event local creation timestamp' },
local_timezone: { type: 'string', description: 'Campaign event local timezone' },
created_at: { type: 'string', description: 'Campaign event creation timestamp' },
},
lead: {
id: { type: 'number', description: 'Lead ID' },
email: { type: 'string', description: 'Lead email address' },
first_name: { type: 'string', description: 'Lead first name' },
last_name: { type: 'string', description: 'Lead last name' },
status: { type: 'string', description: 'Lead status' },
title: { type: 'string', description: 'Lead title' },
company: { type: 'string', description: 'Lead company' },
custom_variables: { type: 'json', description: 'Lead custom variables' },
emails_sent: { type: 'number', description: 'Lead emails sent count' },
opens: { type: 'number', description: 'Lead open count' },
unique_opens: { type: 'number', description: 'Lead unique open count' },
replies: { type: 'number', description: 'Lead reply count' },
unique_replies: { type: 'number', description: 'Lead unique reply count' },
bounces: { type: 'number', description: 'Lead bounce count' },
},
campaign: {
id: { type: 'number', description: 'Campaign ID' },
name: { type: 'string', description: 'Campaign name' },
},
senderEmail: {
id: { type: 'number', description: 'Sender email ID' },
name: { type: 'string', description: 'Sender email name' },
email: { type: 'string', description: 'Sender email address' },
status: { type: 'string', description: 'Sender email status' },
account_type: { type: 'string', description: 'Sender email connection type' },
daily_limit: { type: 'number', description: 'Sender email daily limit' },
emails_sent: { type: 'number', description: 'Sender email sent count' },
replied: { type: 'number', description: 'Sender email replied count' },
opened: { type: 'number', description: 'Sender email opened count' },
unsubscribed: { type: 'number', description: 'Sender email unsubscribed count' },
bounced: { type: 'number', description: 'Sender email bounced count' },
unique_replies: { type: 'number', description: 'Sender email unique reply count' },
unique_opens: { type: 'number', description: 'Sender email unique open count' },
total_leads_contacted: { type: 'number', description: 'Sender email total leads contacted' },
interested: { type: 'number', description: 'Sender email interested count' },
created_at: { type: 'string', description: 'Sender email creation timestamp' },
updated_at: { type: 'string', description: 'Sender email update timestamp' },
},
}
}
export function buildEmailBisonLeadFirstContactedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonEmailSentOutputs()
}
export function buildEmailBisonLeadUnsubscribedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonEmailSentOutputs()
}
export function buildEmailBisonEmailOpenedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonEmailSentOutputs()
}
export function buildEmailBisonLeadRepliedOutputs(): Record<string, TriggerOutput> {
return {
...buildEmailBisonOutputs(),
reply: {
id: { type: 'number', description: 'Reply ID' },
uuid: { type: 'string', description: 'Reply UUID' },
email_subject: { type: 'string', description: 'Reply email subject' },
interested: { type: 'boolean', description: 'Whether the reply is marked interested' },
automated_reply: { type: 'boolean', description: 'Whether the reply is automated' },
html_body: { type: 'string', description: 'Reply HTML body' },
text_body: { type: 'string', description: 'Reply plain text body' },
raw_body: { type: 'string', description: 'Raw MIME reply body' },
headers: { type: 'string', description: 'Encoded raw email headers' },
date_received: { type: 'string', description: 'Reply received timestamp' },
from_name: { type: 'string', description: 'Reply sender name' },
from_email_address: { type: 'string', description: 'Reply sender email address' },
primary_to_email_address: { type: 'string', description: 'Primary recipient email address' },
to: { type: 'json', description: 'Reply To recipients' },
cc: { type: 'json', description: 'Reply CC recipients' },
bcc: { type: 'json', description: 'Reply BCC recipients' },
parent_id: { type: 'number', description: 'Parent reply ID' },
reply_type: { type: 'string', description: 'Reply type' },
folder: { type: 'string', description: 'Reply folder' },
raw_message_id: { type: 'string', description: 'Raw email message ID' },
created_at: { type: 'string', description: 'Reply creation timestamp' },
updated_at: { type: 'string', description: 'Reply update timestamp' },
attachments: { type: 'json', description: 'Reply attachments' },
},
campaignEvent: {
id: { type: 'number', description: 'Campaign event ID' },
event_type: { type: 'string', description: 'Campaign event type' },
created_at_local: { type: 'string', description: 'Campaign event local creation timestamp' },
local_timezone: { type: 'string', description: 'Campaign event local timezone' },
created_at: { type: 'string', description: 'Campaign event creation timestamp' },
},
lead: {
id: { type: 'number', description: 'Lead ID' },
email: { type: 'string', description: 'Lead email address' },
first_name: { type: 'string', description: 'Lead first name' },
last_name: { type: 'string', description: 'Lead last name' },
status: { type: 'string', description: 'Lead status' },
title: { type: 'string', description: 'Lead title' },
company: { type: 'string', description: 'Lead company' },
custom_variables: { type: 'json', description: 'Lead custom variables' },
emails_sent: { type: 'number', description: 'Lead emails sent count' },
opens: { type: 'number', description: 'Lead open count' },
unique_opens: { type: 'number', description: 'Lead unique open count' },
replies: { type: 'number', description: 'Lead reply count' },
unique_replies: { type: 'number', description: 'Lead unique reply count' },
bounces: { type: 'number', description: 'Lead bounce count' },
},
campaign: {
id: { type: 'number', description: 'Campaign ID' },
name: { type: 'string', description: 'Campaign name' },
},
scheduledEmail: {
id: { type: 'number', description: 'Scheduled email ID' },
sequence_step_id: { type: 'number', description: 'Sequence step ID' },
sequence_step_order: { type: 'number', description: 'Sequence step order' },
sequence_step_variant: { type: 'number', description: 'Sequence step variant' },
status: { type: 'string', description: 'Scheduled email status' },
scheduled_date_est: { type: 'string', description: 'Scheduled date in EST' },
scheduled_date_local: { type: 'string', description: 'Scheduled date in local timezone' },
local_timezone: { type: 'string', description: 'Scheduled email local timezone' },
sent_at: { type: 'string', description: 'Email sent timestamp' },
opens: { type: 'number', description: 'Open count' },
replies: { type: 'number', description: 'Reply count' },
unique_opens: { type: 'number', description: 'Unique open count' },
unique_replies: { type: 'number', description: 'Unique reply count' },
interested: { type: 'string', description: 'Interested status' },
raw_message_id: { type: 'string', description: 'Raw email message ID' },
},
senderEmail: {
id: { type: 'number', description: 'Sender email ID' },
name: { type: 'string', description: 'Sender email name' },
email: { type: 'string', description: 'Sender email address' },
status: { type: 'string', description: 'Sender email status' },
account_type: { type: 'string', description: 'Sender email connection type' },
daily_limit: { type: 'number', description: 'Sender email daily limit' },
emails_sent: { type: 'number', description: 'Sender email sent count' },
replied: { type: 'number', description: 'Sender email replied count' },
opened: { type: 'number', description: 'Sender email opened count' },
unsubscribed: { type: 'number', description: 'Sender email unsubscribed count' },
bounced: { type: 'number', description: 'Sender email bounced count' },
unique_replies: { type: 'number', description: 'Sender email unique reply count' },
unique_opens: { type: 'number', description: 'Sender email unique open count' },
total_leads_contacted: { type: 'number', description: 'Sender email total leads contacted' },
interested: { type: 'number', description: 'Sender email interested count' },
created_at: { type: 'string', description: 'Sender email creation timestamp' },
updated_at: { type: 'string', description: 'Sender email update timestamp' },
},
}
}
export function buildEmailBisonLeadInterestedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonLeadRepliedOutputs()
}
export function buildEmailBisonEmailBouncedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonLeadRepliedOutputs()
}
export function buildEmailBisonManualEmailSentOutputs(): Record<string, TriggerOutput> {
return {
...buildEmailBisonOutputs(),
reply: {
id: { type: 'number', description: 'Reply ID' },
email_subject: { type: 'string', description: 'Reply email subject' },
interested: { type: 'boolean', description: 'Whether the reply is marked interested' },
automated_reply: { type: 'boolean', description: 'Whether the reply is automated' },
html_body: { type: 'string', description: 'Reply HTML body' },
text_body: { type: 'string', description: 'Reply plain text body' },
raw_body: { type: 'string', description: 'Raw MIME reply body' },
headers: { type: 'string', description: 'Encoded raw email headers' },
date_received: { type: 'string', description: 'Reply received timestamp' },
reply_type: { type: 'string', description: 'Reply type' },
from_name: { type: 'string', description: 'Reply sender name' },
from_email_address: { type: 'string', description: 'Reply sender email address' },
primary_to_email_address: { type: 'string', description: 'Primary recipient email address' },
to: { type: 'json', description: 'Reply To recipients' },
cc: { type: 'json', description: 'Reply CC recipients' },
bcc: { type: 'json', description: 'Reply BCC recipients' },
parent_id: { type: 'json', description: 'Parent reply ID' },
folder: { type: 'string', description: 'Reply folder' },
raw_message_id: { type: 'string', description: 'Raw email message ID' },
created_at: { type: 'string', description: 'Reply creation timestamp' },
updated_at: { type: 'string', description: 'Reply update timestamp' },
attachments: { type: 'json', description: 'Reply attachments' },
},
lead: {
id: { type: 'number', description: 'Lead ID' },
email: { type: 'string', description: 'Lead email address' },
first_name: { type: 'string', description: 'Lead first name' },
last_name: { type: 'string', description: 'Lead last name' },
status: { type: 'string', description: 'Lead status' },
title: { type: 'string', description: 'Lead title' },
company: { type: 'string', description: 'Lead company' },
custom_variables: { type: 'json', description: 'Lead custom variables' },
emails_sent: { type: 'number', description: 'Lead emails sent count' },
opens: { type: 'number', description: 'Lead open count' },
unique_opens: { type: 'number', description: 'Lead unique open count' },
replies: { type: 'number', description: 'Lead reply count' },
unique_replies: { type: 'number', description: 'Lead unique reply count' },
bounces: { type: 'number', description: 'Lead bounce count' },
},
campaign: {
id: { type: 'number', description: 'Campaign ID' },
name: { type: 'string', description: 'Campaign name' },
},
scheduledEmail: {
id: { type: 'number', description: 'Scheduled email ID' },
sequence_step_id: { type: 'number', description: 'Sequence step ID' },
sequence_step_order: { type: 'number', description: 'Sequence step order' },
sequence_step_variant: { type: 'number', description: 'Sequence step variant' },
status: { type: 'string', description: 'Scheduled email status' },
scheduled_date_est: { type: 'string', description: 'Scheduled date in EST' },
scheduled_date_local: { type: 'string', description: 'Scheduled date in local timezone' },
local_timezone: { type: 'string', description: 'Scheduled email local timezone' },
sent_at: { type: 'string', description: 'Email sent timestamp' },
opens: { type: 'number', description: 'Open count' },
replies: { type: 'number', description: 'Reply count' },
unique_opens: { type: 'number', description: 'Unique open count' },
unique_replies: { type: 'number', description: 'Unique reply count' },
interested: { type: 'json', description: 'Interested status' },
raw_message_id: { type: 'string', description: 'Raw email message ID' },
},
senderEmail: {
id: { type: 'number', description: 'Sender email ID' },
name: { type: 'string', description: 'Sender email name' },
email: { type: 'string', description: 'Sender email address' },
status: { type: 'string', description: 'Sender email status' },
account_type: { type: 'string', description: 'Sender email connection type' },
daily_limit: { type: 'number', description: 'Sender email daily limit' },
emails_sent: { type: 'number', description: 'Sender email sent count' },
replied: { type: 'number', description: 'Sender email replied count' },
opened: { type: 'number', description: 'Sender email opened count' },
unsubscribed: { type: 'number', description: 'Sender email unsubscribed count' },
bounced: { type: 'number', description: 'Sender email bounced count' },
unique_replies: { type: 'number', description: 'Sender email unique reply count' },
unique_opens: { type: 'number', description: 'Sender email unique open count' },
total_leads_contacted: { type: 'number', description: 'Sender email total leads contacted' },
interested: { type: 'number', description: 'Sender email interested count' },
created_at: { type: 'string', description: 'Sender email creation timestamp' },
updated_at: { type: 'string', description: 'Sender email update timestamp' },
},
}
}
export function buildEmailBisonTagAttachedOutputs(): Record<string, TriggerOutput> {
return {
...buildEmailBisonOutputs(),
tagId: { type: 'number', description: 'Email Bison tag ID' },
tagName: { type: 'string', description: 'Email Bison tag name' },
taggableId: { type: 'number', description: 'ID of the tagged resource' },
taggableType: { type: 'string', description: 'Type of the tagged resource' },
}
}
export function buildEmailBisonTagRemovedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonTagAttachedOutputs()
}
export function buildEmailBisonEmailAccountAddedOutputs(): Record<string, TriggerOutput> {
return {
...buildEmailBisonOutputs(),
senderEmail: {
id: { type: 'number', description: 'Sender email ID' },
name: { type: 'string', description: 'Sender email name' },
email: { type: 'string', description: 'Sender email address' },
status: { type: 'string', description: 'Sender email status' },
account_type: { type: 'string', description: 'Sender email connection type' },
daily_limit: { type: 'number', description: 'Sender email daily limit' },
emails_sent: { type: 'number', description: 'Sender email sent count' },
replied: { type: 'number', description: 'Sender email replied count' },
opened: { type: 'number', description: 'Sender email opened count' },
unsubscribed: { type: 'number', description: 'Sender email unsubscribed count' },
bounced: { type: 'number', description: 'Sender email bounced count' },
unique_replies: { type: 'number', description: 'Sender email unique reply count' },
unique_opens: { type: 'number', description: 'Sender email unique open count' },
total_leads_contacted: { type: 'number', description: 'Sender email total leads contacted' },
interested: { type: 'number', description: 'Sender email interested count' },
created_at: { type: 'string', description: 'Sender email creation timestamp' },
updated_at: { type: 'string', description: 'Sender email update timestamp' },
},
}
}
export function buildEmailBisonEmailAccountRemovedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonEmailAccountAddedOutputs()
}
export function buildEmailBisonEmailAccountDisconnectedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonEmailAccountAddedOutputs()
}
export function buildEmailBisonEmailAccountReconnectedOutputs(): Record<string, TriggerOutput> {
return buildEmailBisonEmailAccountAddedOutputs()
}
export function buildEmailBisonWarmupDisabledReceivingBouncesOutputs(): Record<
string,
TriggerOutput
> {
return buildEmailBisonEmailAccountAddedOutputs()
}
export function buildEmailBisonWarmupDisabledCausingBouncesOutputs(): Record<
string,
TriggerOutput
> {
return buildEmailBisonEmailAccountAddedOutputs()
}
export function buildEmailBisonUntrackedReplyReceivedOutputs(): Record<string, TriggerOutput> {
return {
...buildEmailBisonOutputs(),
reply: {
id: { type: 'number', description: 'Reply ID' },
uuid: { type: 'string', description: 'Reply UUID' },
email_subject: { type: 'string', description: 'Reply email subject' },
interested: { type: 'boolean', description: 'Whether the reply is marked interested' },
automated_reply: { type: 'boolean', description: 'Whether the reply is automated' },
html_body: { type: 'string', description: 'Reply HTML body' },
text_body: { type: 'string', description: 'Reply plain text body' },
raw_body: { type: 'string', description: 'Raw MIME reply body' },
headers: { type: 'string', description: 'Encoded raw email headers' },
date_received: { type: 'string', description: 'Reply received timestamp' },
from_name: { type: 'string', description: 'Reply sender name' },
from_email_address: { type: 'string', description: 'Reply sender email address' },
primary_to_email_address: { type: 'string', description: 'Primary recipient email address' },
to: { type: 'json', description: 'Reply To recipients' },
cc: { type: 'json', description: 'Reply CC recipients' },
bcc: { type: 'json', description: 'Reply BCC recipients' },
parent_id: { type: 'number', description: 'Parent reply ID' },
reply_type: { type: 'string', description: 'Reply type' },
folder: { type: 'string', description: 'Reply folder' },
raw_message_id: { type: 'string', description: 'Raw email message ID' },
created_at: { type: 'string', description: 'Reply creation timestamp' },
updated_at: { type: 'string', description: 'Reply update timestamp' },
attachments: { type: 'json', description: 'Reply attachments' },
},
senderEmail: {
id: { type: 'number', description: 'Sender email ID' },
name: { type: 'string', description: 'Sender email name' },
email: { type: 'string', description: 'Sender email address' },
status: { type: 'string', description: 'Sender email status' },
account_type: { type: 'string', description: 'Sender email connection type' },
daily_limit: { type: 'number', description: 'Sender email daily limit' },
emails_sent: { type: 'number', description: 'Sender email sent count' },
replied: { type: 'number', description: 'Sender email replied count' },
opened: { type: 'number', description: 'Sender email opened count' },
unsubscribed: { type: 'number', description: 'Sender email unsubscribed count' },
bounced: { type: 'number', description: 'Sender email bounced count' },
unique_replies: { type: 'number', description: 'Sender email unique reply count' },
unique_opens: { type: 'number', description: 'Sender email unique open count' },
total_leads_contacted: { type: 'number', description: 'Sender email total leads contacted' },
interested: { type: 'number', description: 'Sender email interested count' },
created_at: { type: 'string', description: 'Sender email creation timestamp' },
updated_at: { type: 'string', description: 'Sender email update timestamp' },
},
}
}
export function getEmailBisonEventTypeForTrigger(triggerId: string): string | undefined {
return EMAILBISON_TRIGGER_TO_EVENT_TYPE[
triggerId as keyof typeof EMAILBISON_TRIGGER_TO_EVENT_TYPE
]
}
export function isEmailBisonEventMatch(triggerId: string, body: Record<string, unknown>): boolean {
const expectedEventType = getEmailBisonEventTypeForTrigger(triggerId)
if (!expectedEventType) return false
const event = body.event
if (!isRecordLike(event)) return false
const actualEventType = event.type
return typeof actualEventType === 'string' && actualEventType.toLowerCase() === expectedEventType
}