diff --git a/src/api/integrations/channel/meta/whatsapp.business.service.ts b/src/api/integrations/channel/meta/whatsapp.business.service.ts index 1e4808c1..1f820d0e 100644 --- a/src/api/integrations/channel/meta/whatsapp.business.service.ts +++ b/src/api/integrations/channel/meta/whatsapp.business.service.ts @@ -668,6 +668,21 @@ export class BusinessStartupService extends ChannelStartupService { sendTelemetry(`received.message.${messageRaw.messageType ?? 'unknown'}`); + // Normalized order: Chatwoot first, then bot (consistent with Baileys channel) + if (this.configService.get('CHATWOOT').ENABLED && this.localChatwoot?.enabled) { + const chatwootSentMessage = await this.chatwootService.eventWhatsapp( + Events.MESSAGES_UPSERT, + { instanceName: this.instance.name, instanceId: this.instanceId }, + messageRaw, + ); + + if (chatwootSentMessage) { + messageRaw.chatwootMessageId = chatwootSentMessage.id; + messageRaw.chatwootInboxId = chatwootSentMessage.inbox_id; + messageRaw.chatwootConversationId = chatwootSentMessage.conversation_id; + } + } + this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw); await chatbotController.emit({ @@ -677,20 +692,6 @@ export class BusinessStartupService extends ChannelStartupService { pushName: messageRaw.pushName, }); - if (this.configService.get('CHATWOOT').ENABLED && this.localChatwoot?.enabled) { - const chatwootSentMessage = await this.chatwootService.eventWhatsapp( - Events.MESSAGES_UPSERT, - { instanceName: this.instance.name, instanceId: this.instanceId }, - messageRaw, - ); - - if (chatwootSentMessage?.id) { - messageRaw.chatwootMessageId = chatwootSentMessage.id; - messageRaw.chatwootInboxId = chatwootSentMessage.id; - messageRaw.chatwootConversationId = chatwootSentMessage.id; - } - } - if (!this.isMediaMessage(message) && message.type !== 'sticker') { await this.prismaRepository.message.create({ data: messageRaw, diff --git a/src/api/integrations/chatbot/base-chatbot.controller.ts b/src/api/integrations/chatbot/base-chatbot.controller.ts index a5b83e25..4108785e 100644 --- a/src/api/integrations/chatbot/base-chatbot.controller.ts +++ b/src/api/integrations/chatbot/base-chatbot.controller.ts @@ -797,7 +797,7 @@ export abstract class BaseChatbotController { + const normalizedContent = content?.trim() || ''; + // Check for triggerType 'all' or 'none' (both should match any message) const findTriggerAllOrNone = await botRepository.findFirst({ where: { @@ -16,6 +18,12 @@ export const findBotByTrigger = async (botRepository: any, content: string, inst return findTriggerAllOrNone; } + // If content is empty (null, undefined, whitespace-only, or media-only messages), + // only 'all'/'none' triggers apply — skip keyword/regex matching + if (!normalizedContent) { + return null; + } + const findTriggerAdvanced = await botRepository.findMany({ where: { enabled: true, diff --git a/src/utils/getConversationMessage.ts b/src/utils/getConversationMessage.ts index 377df64c..5c5bcc3c 100644 --- a/src/utils/getConversationMessage.ts +++ b/src/utils/getConversationMessage.ts @@ -85,5 +85,6 @@ const getMessageContent = (types: any) => { export const getConversationMessage = (msg: any) => { const types = getTypeMessage(msg); const messageContent = getMessageContent(types); - return messageContent; + + return messageContent ?? ''; };