diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json
index 6ae9da149c..06e4989743 100644
--- a/apps/web/public/static/locales/en/common.json
+++ b/apps/web/public/static/locales/en/common.json
@@ -2720,6 +2720,7 @@
"attendee_timezone_info": "Attendee Timezone",
"event_start_time_in_attendee_timezone_info": "Event Start Time In Attendee Timezone",
"event_end_time_in_attendee_timezone_info": "Event End Time In Attendee Timezone",
+ "salesforce_create_event_on_contact": "Create event on contact, if it exists. Else fallback to lead",
"salesforce_owner_name_to_change": "Owner name to change",
"ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑"
}
diff --git a/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx b/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx
index 9fe63b17f2..c6d37c7427 100644
--- a/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx
+++ b/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx
@@ -27,6 +27,7 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
const createEventOn = getAppData("createEventOn") ?? SalesforceRecordEnum.CONTACT;
const onBookingWriteToEventObject = getAppData("onBookingWriteToEventObject") ?? false;
const onBookingWriteToEventObjectMap = getAppData("onBookingWriteToEventObjectMap") ?? {};
+ const createEventOnLeadCheckForContact = getAppData("createEventOnLeadCheckForContact") ?? false;
const onBookingChangeRecordOwner = getAppData("onBookingChangeRecordOwner") ?? false;
const onBookingChangeRecordOwnerName = getAppData("onBookingChangeRecordOwnerName") ?? [];
const { t } = useLocale();
@@ -93,6 +94,18 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({
/>
) : null}
+ {createEventOnSelectedOption.value === SalesforceRecordEnum.LEAD ? (
+
+ {
+ setAppData("createEventOnLeadCheckForContact", checked);
+ }}
+ />
+
+ ) : null}
{createEventOnSelectedOption.value === SalesforceRecordEnum.ACCOUNT ? (
<>
diff --git a/packages/app-store/salesforce/lib/CrmService.ts b/packages/app-store/salesforce/lib/CrmService.ts
index d7c8e4fffb..f6ec791f61 100644
--- a/packages/app-store/salesforce/lib/CrmService.ts
+++ b/packages/app-store/salesforce/lib/CrmService.ts
@@ -342,9 +342,27 @@ export default class SalesforceCRMService implements CRM {
}
const results = await conn.query(soql);
- if (!results || !results.records.length) return [];
+ let records: ContactRecord[] = [];
- const records = results.records as ContactRecord[];
+ // If falling back to contacts, check for the contact before returning the leads or empty array
+ if (
+ appOptions.createEventOn === SalesforceRecordEnum.LEAD &&
+ appOptions.createEventOnLeadCheckForContact
+ ) {
+ // Get any matching contacts
+ const contactSearch = await conn.query(
+ `SELECT Id, Email, OwnerId FROM ${SalesforceRecordEnum.CONTACT} WHERE Email IN ('${emailArray.join(
+ "','"
+ )}')`
+ );
+
+ if (contactSearch && contactSearch.records.length > 0)
+ records = contactSearch.records as ContactRecord[];
+ } else if (!results || !results.records.length) {
+ return [];
+ }
+
+ if (!records.length) records = results.records as ContactRecord[];
if (includeOwner || forRoundRobinSkip) {
const ownerIds: Set = new Set();
diff --git a/packages/app-store/salesforce/zod.ts b/packages/app-store/salesforce/zod.ts
index 512d6614e9..ad3eb41e12 100644
--- a/packages/app-store/salesforce/zod.ts
+++ b/packages/app-store/salesforce/zod.ts
@@ -15,6 +15,7 @@ export const appDataSchema = eventTypeAppCardZod.extend({
createLeadIfAccountNull: z.boolean().optional(),
onBookingWriteToEventObject: z.boolean().optional(),
onBookingWriteToEventObjectMap: z.record(z.any()).optional(),
+ createEventOnLeadCheckForContact: z.boolean().optional(),
onBookingChangeRecordOwner: z.boolean().optional(),
onBookingChangeRecordOwnerName: z.string().optional(),
});