|
18301
|
793
|
6
|
2026-05-11T11:09:43.327490+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497783327_m2.jpg...
|
PhpStorm
|
faVsco.js – laravel.log
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-h PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limitProiect vC) TrackAutomated ReportGeneratedzventonp= custom.logT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ongDeleteCrmEntityTrait.php= nuospor-lournal-poll.log©) HandleHub› onounit.xm© RateLimitExceos ttt.jsE oauth-private.key© PaginationConfia.phdE oauth-public.keyclass J1minnyDebuqcommand extends CommandE storageE supervisord.pidtext-relav.ison363v w tests> Featurelintearationu Servicesv 7UniN ComoonentiM ConcoleiM ContractsIDTOEnumsm EventsD Exceptions©) EmailActivityImportExc/HandlerTest.php© RateLimitExceptionTes0) fixturesGuardsW Helpersm) HttoIntearationsalinteractionsaHobs> ActivitvM AiAutomation> Audidv MAutomatedReports( CreateResultsTest , 391© RequestGenerateA, 392( RequestGenerateR, 393( SendRenortEypirine 394C) SendRenort.lohTes@ SendReportMailJob( SendRenortNotGen 397Tm Cnlondarm CrmlM NonlDicke• MMailbayTacts naccod. 12 (todav 12:02private function natelamutfor (Si = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {scnis"pinto syneine opporcunity 1s1rSthis->info( string: "Matching contact {$i}"):scrmservice->syncupporcun1cy 574/20564'scrmservice->macchbyname "kobot"1 usageprivate function simulateMatchActivityStorm(int SteamId = 2, int $count = 100): voidSconfio = steam->oetcrmconflourationobSactivities = Activitv:quervoerm confiauration id' Sconfio->aetidon->orderBvDescdi->Uimit(Scount)->getO:Sthis->info( string: "Dispatching {Sactivities->count} MatchActivityCrmData jobs (portal={$config->getidO})"):foreach (Sactivities as $activity) {MatchActivityCrmData::dispatch( ...arguments: Sactivity->getId, $config, true):Sthis->info( string: 'Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.'):no usagesprivate function simulateVerifyTaskStorm(int SteamId = 2. int $count = 100): voidSactavitles = Activity::quervol>where co'team_1d', Steamid)'cem provider id')->net05Sthis->info( string: "Dispatching (Sactivities->count} VerifyActivityCrmTaskJob jobs");foneach (Sactivities as Sactivitv) $(c) HubSpot/Service.onp= custom.logm| A5 A133 X11 ^ VTHPreparation tor kerl.. In o1mMon 11 May 14:09:42A SF [jiminny@localhost]A console [EUiconsole [STAGINGICc W.*L2026-05-11 11:08:45] Local.INF0: Jiminny \Console \Commands\Command::run Memory usage before starting command 1"com12026-05-11 11208 45DO0LNS LCommands AsvncUndateEsEntities Stantino ES undate wonken : nid"72650 "wonkentd"e""[2026-05-11 11:08:46] local.INF0: Jiminny\Console\Commands\Command::run Memory usage[2026-05-11 11:09:12] local.INF0: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true, "set[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"co[2026-05-11 11:09:12] local.INF0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,[2026-05-11 11:09:12] local.INF0: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"c[2026-05-11 11:09:12] local.INF0: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hannplation id"."f72d/Mch-7kckche27.ak/t[2026-05-11 11:09:12] local.INF0: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"[2026-05-11 11:09:12] local.INF0: [EncryptedTokenManager] Generating access token. {"mode":"Le[2026-05-11 11:09:12] local.INF0: [Crm0wnerResolver] Integration"crn owner:140 ceam 10.er = correlatlo,2026-05-11 11:04:12 LocaL.INFU: Prospect match Lache miss2026-05-11 11:04:15 LocaL.LNFU: HUDSP[2026-05-11 11:09:13] local.INF0: [Prospect2026-05-11 11:0%:15 Local.WAKNING:2026-05-11 1:09115 LOCOL.WARNING:[Hubspotl Receiveres Hubspot cxceptionsbaak.'POST htt"status":"error", "message":"Youl"*"correlation_1d":"f35047ch-16c6-4c27-0641-48chf692623012026-05-11111:09:131 LocaL.INF0: HandleHubspotRatelimitl Ratel[2026-05-11 11:09:141 local.INF0: [MatchActivitvCrmDatal Starting CRM dat2026-05-11 11:09:141 LocoL.INF0: EsUpdatelarget Uodate sinale"activities" "purpose". "searchable-observer-uodate" "entityld":614436} {"сT2026-05-11 11:09:141 LocaL.INFO:12026-05-111L2026-05-11 11:09:14] Local.INF0: LSocialAccountServicel Fetching token 112026-05-11 11:09•141 loco1TNF0:[SocialAccountServicell[2026-05-11 11:09:14] local.INF0: [EncryptedTokenManager] Generating access token.12026-05-11 11:09•141 loco1TNS0:|CrmOwnerResolver] Intearationerm ownen":148 "team id"-2 "correlatio2026-05-11 11:09:141 l0c01TNE0: Prosoect matchl Cache local search hitl[2026-05-11 11:09:14] local.INF0: [Prospect match] cached empty result[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay12024-05-11 11•09•1/1 1ocol TNS0• [MatchActivitvêrmhatal Stantina CPM data[2026-05-11 11:09:14] local.INF0: [ EsUpdateTarget ] Update single target"activities" "purpose": "searchable-observer-update" "entityId":614382} {"co(2026-05-11 11:09:14] local.INF0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities" "entityId":614382.(2026-05-11 11:09:14] local.INF0: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact id":nu[2026-05-11 11:09:14] local.INF0: [SocialAccountService] Fetching token {"socialAcconnolation idi."£A0a/5Ak-adfo-4fdn-h93)[2026-05-11 11:09:14] local.INF0: [SocialAccountService] Token retrieved {"socialAc[2026-05-11 11:09:14] local.INF0: [EncryptedTokenManager] Generating access tokent"} {"correlation_id":"f00a4506-adfe-4fdc-b9idH. H6000/C04-odfo-A6dah072-04d0hA7C16dollI12026-05-11 11:07:14 LocaL.LNrU: urmuid":2} {"correlatioomll ficonnolotin12026-05-11 11:07:14 LocaL.INrU: Prospect march. Lache Local search hir -"10ent1t1[2026-05-11 11:09:14] local.INF0: [Prospect matchl cached empty result - no APT calls, try next matching method {"identifier type"."email"[2026-05-11 11:09:14] local.INF0: [Hant12026-05-11 11:09:141 LocaL.INF0: Mat[2026-05-11 11:09:14] local.INF0: [ As12026-05-11 11:09-141 LOc0L INF012026-05-11 11:09-141 Loc0L TNF0: Soc2026-05-11 11:09:141 LocaLTNF0:2026-05-11 11:09:141 LocaLTNF0: 1Enc2026-05-11 11:09:141 L0caL,1NF0: 1Crm...
|
NULL
|
7953637837604037898
|
NULL
|
visual_change
|
ocr
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-h PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limitProiect vC) TrackAutomated ReportGeneratedzventonp= custom.logT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ongDeleteCrmEntityTrait.php= nuospor-lournal-poll.log©) HandleHub› onounit.xm© RateLimitExceos ttt.jsE oauth-private.key© PaginationConfia.phdE oauth-public.keyclass J1minnyDebuqcommand extends CommandE storageE supervisord.pidtext-relav.ison363v w tests> Featurelintearationu Servicesv 7UniN ComoonentiM ConcoleiM ContractsIDTOEnumsm EventsD Exceptions©) EmailActivityImportExc/HandlerTest.php© RateLimitExceptionTes0) fixturesGuardsW Helpersm) HttoIntearationsalinteractionsaHobs> ActivitvM AiAutomation> Audidv MAutomatedReports( CreateResultsTest , 391© RequestGenerateA, 392( RequestGenerateR, 393( SendRenortEypirine 394C) SendRenort.lohTes@ SendReportMailJob( SendRenortNotGen 397Tm Cnlondarm CrmlM NonlDicke• MMailbayTacts naccod. 12 (todav 12:02private function natelamutfor (Si = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {scnis"pinto syneine opporcunity 1s1rSthis->info( string: "Matching contact {$i}"):scrmservice->syncupporcun1cy 574/20564'scrmservice->macchbyname "kobot"1 usageprivate function simulateMatchActivityStorm(int SteamId = 2, int $count = 100): voidSconfio = steam->oetcrmconflourationobSactivities = Activitv:quervoerm confiauration id' Sconfio->aetidon->orderBvDescdi->Uimit(Scount)->getO:Sthis->info( string: "Dispatching {Sactivities->count} MatchActivityCrmData jobs (portal={$config->getidO})"):foreach (Sactivities as $activity) {MatchActivityCrmData::dispatch( ...arguments: Sactivity->getId, $config, true):Sthis->info( string: 'Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.'):no usagesprivate function simulateVerifyTaskStorm(int SteamId = 2. int $count = 100): voidSactavitles = Activity::quervol>where co'team_1d', Steamid)'cem provider id')->net05Sthis->info( string: "Dispatching (Sactivities->count} VerifyActivityCrmTaskJob jobs");foneach (Sactivities as Sactivitv) $(c) HubSpot/Service.onp= custom.logm| A5 A133 X11 ^ VTHPreparation tor kerl.. In o1mMon 11 May 14:09:42A SF [jiminny@localhost]A console [EUiconsole [STAGINGICc W.*L2026-05-11 11:08:45] Local.INF0: Jiminny \Console \Commands\Command::run Memory usage before starting command 1"com12026-05-11 11208 45DO0LNS LCommands AsvncUndateEsEntities Stantino ES undate wonken : nid"72650 "wonkentd"e""[2026-05-11 11:08:46] local.INF0: Jiminny\Console\Commands\Command::run Memory usage[2026-05-11 11:09:12] local.INF0: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true, "set[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"co[2026-05-11 11:09:12] local.INF0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,[2026-05-11 11:09:12] local.INF0: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"c[2026-05-11 11:09:12] local.INF0: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hannplation id"."f72d/Mch-7kckche27.ak/t[2026-05-11 11:09:12] local.INF0: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"[2026-05-11 11:09:12] local.INF0: [EncryptedTokenManager] Generating access token. {"mode":"Le[2026-05-11 11:09:12] local.INF0: [Crm0wnerResolver] Integration"crn owner:140 ceam 10.er = correlatlo,2026-05-11 11:04:12 LocaL.INFU: Prospect match Lache miss2026-05-11 11:04:15 LocaL.LNFU: HUDSP[2026-05-11 11:09:13] local.INF0: [Prospect2026-05-11 11:0%:15 Local.WAKNING:2026-05-11 1:09115 LOCOL.WARNING:[Hubspotl Receiveres Hubspot cxceptionsbaak.'POST htt"status":"error", "message":"Youl"*"correlation_1d":"f35047ch-16c6-4c27-0641-48chf692623012026-05-11111:09:131 LocaL.INF0: HandleHubspotRatelimitl Ratel[2026-05-11 11:09:141 local.INF0: [MatchActivitvCrmDatal Starting CRM dat2026-05-11 11:09:141 LocoL.INF0: EsUpdatelarget Uodate sinale"activities" "purpose". "searchable-observer-uodate" "entityld":614436} {"сT2026-05-11 11:09:141 LocaL.INFO:12026-05-111L2026-05-11 11:09:14] Local.INF0: LSocialAccountServicel Fetching token 112026-05-11 11:09•141 loco1TNF0:[SocialAccountServicell[2026-05-11 11:09:14] local.INF0: [EncryptedTokenManager] Generating access token.12026-05-11 11:09•141 loco1TNS0:|CrmOwnerResolver] Intearationerm ownen":148 "team id"-2 "correlatio2026-05-11 11:09:141 l0c01TNE0: Prosoect matchl Cache local search hitl[2026-05-11 11:09:14] local.INF0: [Prospect match] cached empty result[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay12024-05-11 11•09•1/1 1ocol TNS0• [MatchActivitvêrmhatal Stantina CPM data[2026-05-11 11:09:14] local.INF0: [ EsUpdateTarget ] Update single target"activities" "purpose": "searchable-observer-update" "entityId":614382} {"co(2026-05-11 11:09:14] local.INF0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities" "entityId":614382.(2026-05-11 11:09:14] local.INF0: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact id":nu[2026-05-11 11:09:14] local.INF0: [SocialAccountService] Fetching token {"socialAcconnolation idi."£A0a/5Ak-adfo-4fdn-h93)[2026-05-11 11:09:14] local.INF0: [SocialAccountService] Token retrieved {"socialAc[2026-05-11 11:09:14] local.INF0: [EncryptedTokenManager] Generating access tokent"} {"correlation_id":"f00a4506-adfe-4fdc-b9idH. H6000/C04-odfo-A6dah072-04d0hA7C16dollI12026-05-11 11:07:14 LocaL.LNrU: urmuid":2} {"correlatioomll ficonnolotin12026-05-11 11:07:14 LocaL.INrU: Prospect march. Lache Local search hir -"10ent1t1[2026-05-11 11:09:14] local.INF0: [Prospect matchl cached empty result - no APT calls, try next matching method {"identifier type"."email"[2026-05-11 11:09:14] local.INF0: [Hant12026-05-11 11:09:141 LocaL.INF0: Mat[2026-05-11 11:09:14] local.INF0: [ As12026-05-11 11:09-141 LOc0L INF012026-05-11 11:09-141 Loc0L TNF0: Soc2026-05-11 11:09:141 LocaLTNF0:2026-05-11 11:09:141 LocaLTNF0: 1Enc2026-05-11 11:09:141 L0caL,1NF0: 1Crm...
|
18299
|
NULL
|
NULL
|
NULL
|
|
18302
|
792
|
7
|
2026-05-11T11:09:44.058299+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497784058_m1.jpg...
|
PhpStorm
|
faVsco.js – laravel.log
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-5641617897080429754
|
-8160223333407913180
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
iTerm2ShellEditViewSessionScriptsProfilesWindowHelpPreparation for Refi... in 51mDEV (docker)-zshDOCKERcompiledeventsroutesviews- ₴81DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5100% <78• Mon 11 May 14:09:43181-zsh+screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
18300
|
NULL
|
NULL
|
NULL
|
|
18303
|
792
|
8
|
2026-05-11T11:09:54.144483+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497794144_m1.jpg...
|
PhpStorm
|
faVsco.js – laravel.log
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
5
133
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\Crm\Delete\VerifyActivityCrmTaskJob;
use Jiminny\Jobs\Crm\MatchActivityCrmData;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
// Choose ONE of the following to run, then comment out the others.
// 1) Dispatch a storm of MatchActivityCrmData jobs against team 2
$this->simulateMatchActivityStorm(teamId: 2, count: 100);
// 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)
// $this->simulateVerifyTaskStorm(teamId: 2, count: 100);
// 3) Inspect Redis circuit-breaker state for the team's HubSpot portal
// $this->observeRateLimitCache(teamId: 2);
// 4) Make 3 synchronous matchByName calls (foreground, hits API directly)
// $this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$activities = Activity::query()
->where('crm_configuration_id', $config->getId())
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})");
foreach ($activities as $activity) {
MatchActivityCrmData::dispatch($activity->getId(), $config, true);
}
$this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');
}
private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void
{
$activities = Activity::query()
->where('team_id', $teamId)
->whereNotNull('crm_provider_id')
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs");
foreach ($activities as $activity) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
$this->info('Done.');
}
private function observeRateLimitCache(int $teamId = 2): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());
$value = Redis::get($key);
$ttl = Redis::ttl($key);
$this->info("Redis key: {$key}");
$this->info('Value: ' . ($value ?? '(empty)'));
$this->info("TTL: {$ttl}s");
}
}
Show Replace Field
Search History
429...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"133","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\Redis;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\Crm\\Delete\\VerifyActivityCrmTaskJob;\nuse Jiminny\\Jobs\\Crm\\MatchActivityCrmData;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n // Choose ONE of the following to run, then comment out the others.\n // 1) Dispatch a storm of MatchActivityCrmData jobs against team 2\n $this->simulateMatchActivityStorm(teamId: 2, count: 100);\n\n // 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)\n // $this->simulateVerifyTaskStorm(teamId: 2, count: 100);\n\n // 3) Inspect Redis circuit-breaker state for the team's HubSpot portal\n // $this->observeRateLimitCache(teamId: 2);\n\n // 4) Make 3 synchronous matchByName calls (foreground, hits API directly)\n // $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n\n private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n\n $activities = Activity::query()\n ->where('crm_configuration_id', $config->getId())\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})\");\n\n foreach ($activities as $activity) {\n MatchActivityCrmData::dispatch($activity->getId(), $config, true);\n }\n\n $this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');\n }\n\n private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void\n {\n $activities = Activity::query()\n ->where('team_id', $teamId)\n ->whereNotNull('crm_provider_id')\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs\");\n\n foreach ($activities as $activity) {\n VerifyActivityCrmTaskJob::dispatch($activity->getId());\n }\n\n $this->info('Done.');\n }\n\n private function observeRateLimitCache(int $teamId = 2): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n $key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());\n\n $value = Redis::get($key);\n $ttl = Redis::ttl($key);\n\n $this->info(\"Redis key: {$key}\");\n $this->info('Value: ' . ($value ?? '(empty)'));\n $this->info(\"TTL: {$ttl}s\");\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\Redis;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\Crm\\Delete\\VerifyActivityCrmTaskJob;\nuse Jiminny\\Jobs\\Crm\\MatchActivityCrmData;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n // Choose ONE of the following to run, then comment out the others.\n // 1) Dispatch a storm of MatchActivityCrmData jobs against team 2\n $this->simulateMatchActivityStorm(teamId: 2, count: 100);\n\n // 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)\n // $this->simulateVerifyTaskStorm(teamId: 2, count: 100);\n\n // 3) Inspect Redis circuit-breaker state for the team's HubSpot portal\n // $this->observeRateLimitCache(teamId: 2);\n\n // 4) Make 3 synchronous matchByName calls (foreground, hits API directly)\n // $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n\n private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n\n $activities = Activity::query()\n ->where('crm_configuration_id', $config->getId())\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})\");\n\n foreach ($activities as $activity) {\n MatchActivityCrmData::dispatch($activity->getId(), $config, true);\n }\n\n $this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');\n }\n\n private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void\n {\n $activities = Activity::query()\n ->where('team_id', $teamId)\n ->whereNotNull('crm_provider_id')\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs\");\n\n foreach ($activities as $activity) {\n VerifyActivityCrmTaskJob::dispatch($activity->getId());\n }\n\n $this->info('Done.');\n }\n\n private function observeRateLimitCache(int $teamId = 2): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n $key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());\n\n $value = Redis::get($key);\n $ttl = Redis::ttl($key);\n\n $this->info(\"Redis key: {$key}\");\n $this->info('Value: ' . ($value ?? '(empty)'));\n $this->info(\"TTL: {$ttl}s\");\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1209453926218787028
|
3603276678078998955
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
5
133
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\Crm\Delete\VerifyActivityCrmTaskJob;
use Jiminny\Jobs\Crm\MatchActivityCrmData;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
// Choose ONE of the following to run, then comment out the others.
// 1) Dispatch a storm of MatchActivityCrmData jobs against team 2
$this->simulateMatchActivityStorm(teamId: 2, count: 100);
// 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)
// $this->simulateVerifyTaskStorm(teamId: 2, count: 100);
// 3) Inspect Redis circuit-breaker state for the team's HubSpot portal
// $this->observeRateLimitCache(teamId: 2);
// 4) Make 3 synchronous matchByName calls (foreground, hits API directly)
// $this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$activities = Activity::query()
->where('crm_configuration_id', $config->getId())
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})");
foreach ($activities as $activity) {
MatchActivityCrmData::dispatch($activity->getId(), $config, true);
}
$this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');
}
private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void
{
$activities = Activity::query()
->where('team_id', $teamId)
->whereNotNull('crm_provider_id')
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs");
foreach ($activities as $activity) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
$this->info('Done.');
}
private function observeRateLimitCache(int $teamId = 2): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());
$value = Redis::get($key);
$ttl = Redis::ttl($key);
$this->info("Redis key: {$key}");
$this->info('Value: ' . ($value ?? '(empty)'));
$this->info("TTL: {$ttl}s");
}
}
Show Replace Field
Search History
429...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18304
|
793
|
7
|
2026-05-11T11:09:54.163531+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497794163_m2.jpg...
|
PhpStorm
|
faVsco.js – laravel.log
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
5
133
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\Crm\Delete\VerifyActivityCrmTaskJob;
use Jiminny\Jobs\Crm\MatchActivityCrmData;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
// Choose ONE of the following to run, then comment out the others.
// 1) Dispatch a storm of MatchActivityCrmData jobs against team 2
$this->simulateMatchActivityStorm(teamId: 2, count: 100);
// 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)
// $this->simulateVerifyTaskStorm(teamId: 2, count: 100);
// 3) Inspect Redis circuit-breaker state for the team's HubSpot portal
// $this->observeRateLimitCache(teamId: 2);
// 4) Make 3 synchronous matchByName calls (foreground, hits API directly)
// $this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$activities = Activity::query()
->where('crm_configuration_id', $config->getId())
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})");
foreach ($activities as $activity) {
MatchActivityCrmData::dispatch($activity->getId(), $config, true);
}
$this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');
}
private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void
{
$activities = Activity::query()
->where('team_id', $teamId)
->whereNotNull('crm_provider_id')
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs");
foreach ($activities as $activity) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
$this->info('Done.');
}
private function observeRateLimitCache(int $teamId = 2): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());
$value = Redis::get($key);
$ttl = Redis::ttl($key);
$this->info("Redis key: {$key}");
$this->info('Value: ' . ($value ?? '(empty)'));
$this->info("TTL: {$ttl}s");
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.5043218,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"133","depth":4,"bounds":{"left":0.5142952,"top":0.17478053,"width":0.011968086,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"11","depth":4,"bounds":{"left":0.52825797,"top":0.17478053,"width":0.008976064,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\Redis;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\Crm\\Delete\\VerifyActivityCrmTaskJob;\nuse Jiminny\\Jobs\\Crm\\MatchActivityCrmData;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n // Choose ONE of the following to run, then comment out the others.\n // 1) Dispatch a storm of MatchActivityCrmData jobs against team 2\n $this->simulateMatchActivityStorm(teamId: 2, count: 100);\n\n // 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)\n // $this->simulateVerifyTaskStorm(teamId: 2, count: 100);\n\n // 3) Inspect Redis circuit-breaker state for the team's HubSpot portal\n // $this->observeRateLimitCache(teamId: 2);\n\n // 4) Make 3 synchronous matchByName calls (foreground, hits API directly)\n // $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n\n private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n\n $activities = Activity::query()\n ->where('crm_configuration_id', $config->getId())\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})\");\n\n foreach ($activities as $activity) {\n MatchActivityCrmData::dispatch($activity->getId(), $config, true);\n }\n\n $this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');\n }\n\n private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void\n {\n $activities = Activity::query()\n ->where('team_id', $teamId)\n ->whereNotNull('crm_provider_id')\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs\");\n\n foreach ($activities as $activity) {\n VerifyActivityCrmTaskJob::dispatch($activity->getId());\n }\n\n $this->info('Done.');\n }\n\n private function observeRateLimitCache(int $teamId = 2): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n $key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());\n\n $value = Redis::get($key);\n $ttl = Redis::ttl($key);\n\n $this->info(\"Redis key: {$key}\");\n $this->info('Value: ' . ($value ?? '(empty)'));\n $this->info(\"TTL: {$ttl}s\");\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Console\\Commands;\n\nuse Carbon\\Carbon;\nuse Carbon\\CarbonImmutable;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\Redis;\nuse InvalidArgumentException;\nuse Jiminny\\Jobs\\AutomatedReports\\RequestGenerateAskJiminnyReportJob;\nuse Jiminny\\Jobs\\AutomatedReports\\SendReportMailJob;\nuse Jiminny\\Jobs\\Crm\\Delete\\VerifyActivityCrmTaskJob;\nuse Jiminny\\Jobs\\Crm\\MatchActivityCrmData;\nuse Jiminny\\Jobs\\JobDispatcherInterface;\nuse Jiminny\\Models\\Activity;\nuse Jiminny\\Models\\AutomatedReport;\nuse Jiminny\\Models\\AutomatedReportResult;\nuse Jiminny\\Models\\Team;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Repositories\\AutomatedReportsRepository;\nuse Jiminny\\Services\\Activity\\CrmOwnerResolver;\nuse Jiminny\\Services\\Kiosk\\AutomatedReports\\AutomatedReportsService;\nuse Jiminny\\Services\\UserPilot\\UserPilotClient;\n\n/**\n * Class JiminnyDebugCommand\n *\n * @package Jiminny\\Console\\Commands\n */\nclass JiminnyDebugCommand extends Command\n{\n public const string FREQUENCY_DAILY = 'daily';\n public const string FREQUENCY_WEEKLY = 'weekly';\n public const string FREQUENCY_MONTHLY = 'monthly';\n public const string FREQUENCY_QUARTERLY = 'quarterly';\n public const string FREQUENCY_ONE_OFF = 'one_off';\n protected $signature = 'jiminny:debug';\n\n public function handle(\n JobDispatcherInterface $jobDispatcher,\n AutomatedReportsService $automatedReportsService,\n AutomatedReportsRepository $automatedReportsRepository,\n UserPilotClient $userPilotClient\n ): void {\n // Choose ONE of the following to run, then comment out the others.\n // 1) Dispatch a storm of MatchActivityCrmData jobs against team 2\n $this->simulateMatchActivityStorm(teamId: 2, count: 100);\n\n // 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)\n // $this->simulateVerifyTaskStorm(teamId: 2, count: 100);\n\n // 3) Inspect Redis circuit-breaker state for the team's HubSpot portal\n // $this->observeRateLimitCache(teamId: 2);\n\n // 4) Make 3 synchronous matchByName calls (foreground, hits API directly)\n // $this->rateLimit();\n exit(1);\n\n\n\n $report = AutomatedReport::find(71);\n $last = AutomatedReportResult::query()\n ->where('report_id', $report->getId())\n ->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])\n// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)\n ->whereDate('created_at', CarbonImmutable::now()->toDateString())\n ->latest()\n ->first();\n\n $this->info(\"Last: {$last->getId()}\");\n\n exit(1);\n\n $user = User::find(143);\n // $count = $automatedReportsRepository->countUserReports($user);\n // $this->info(\"Count: {$count}\");\n // $count = $automatedReportsRepository->countAllUserReports($user);\n // $this->info(\"All count: {$count}\");\n\n $payload = [\n 'report_type' => 'ask_jiminny',\n 'frequency' => 'weekly',\n ];\n $userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);\n\n exit(1);\n\n $now = Carbon::now()->subDay(1);\n $this->info(\"Now: {$now->toDateTimeString()}\");\n $weekStart = Carbon::getWeekStartsAt();\n $this->info(\"Now: {$weekStart}\");\n\n // $from = $now->copy()->previousWeekday()->startOfDay();\n // $to = $now->copy()->previousWeekday()->endOfDay();\n\n // $fromOld = $now->copy()->subWeeks(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subWeek()->startOfWeek();\n // $toNew = $now->copy()->subWeek()->endOfWeek();\n\n // $fromOld = $now->copy()->subMonths(1)->startOfDay();\n // $toOld = $now->copy()->subDay()->endOfDay();\n // $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();\n // $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();\n\n $fromOld = $now->copy()->subMonths(3)->startOfDay();\n $toOld = $now->copy()->subDay()->endOfDay();\n $fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();\n $toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();\n\n $this->info(\"From old: {$fromOld->toDateTimeString()}\");\n $this->info(\"To old: {$toOld->toDateTimeString()}\");\n $this->info(\"From new: {$fromNew->toDateTimeString()}\");\n $this->info(\"To new: {$toNew->toDateTimeString()}\");\n\n exit(1);\n\n $report = AutomatedReport::find(71);\n\n $job = new RequestGenerateAskJiminnyReportJob($report->getUuid());\n $jobDispatcher->dispatch($job);\n\n exit(1);\n\n\n // $this->formatDate($jobDispatcher);\n // $this->sendMail($jobDispatcher, $automatedReportsService);\n // $this->crmService();\n\n $this->getPayload($automatedReportsService);\n\n exit(1);\n }\n\n\n\n private function crmService()\n {\n $activity = Activity::find(418141);\n\n $team = Team::find(19);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n $crmService->createTranscriptNotes($activity);\n }\n\n private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)\n {\n $reportUuid = '';\n // $report = $automatedReportsService->getReportResult($reportUuid);\n $report = AutomatedReportResult::find(275);\n $validRecipients = $automatedReportsService->getValidRecipientUsers(\n $report->getReport(),\n includeJiminny: true,\n );\n\n $recipient = $validRecipients[0];\n\n $fileName = $automatedReportsService->getReportFileName($report);\n $typeName = $report->getReport()->getCustomName()\n ?? $automatedReportsService->getReportTypeName($report);\n $teamsName = $automatedReportsService->getReportTeamsName($report);\n $periodName = $automatedReportsService->getReportPeriodName($report);\n $s3Path = $automatedReportsService->getMediaPath($report);\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));\n\n $jobDispatcher->dispatch(\n new SendReportMailJob(\n reportUuid: $report->getUuid(),\n s3Path: $s3Path,\n recipientEmail: $recipient['email'],\n recipientName: $recipient['name'] ?? null,\n fileName: $fileName,\n typeName: $typeName,\n teamsName: $teamsName,\n periodName: $periodName,\n isAskJiminny: true,\n )\n );\n\n exit(1);\n }\n\n private function formatDate(JobDispatcherInterface $jobDispatcher): void\n {\n $customName = 'Custom report name';\n // $frequency = self::FREQUENCY_DAILY;\n // $frequency = self::FREQUENCY_WEEKLY;\n $frequency = self::FREQUENCY_MONTHLY;\n // $frequency = self::FREQUENCY_QUARTERLY;\n // $frequency = self::FREQUENCY_ONE_OFF;\n $period = $this->calculateFromAndToDatePeriod($frequency);\n $from = $period['fromDate'];\n $to = $period['toDate'];\n $periodName = $this->formatReportPeriodName($frequency, $from, $to);\n $filenameSuffix = null;\n\n if ($customName) {\n if ($filenameSuffix) {\n $customName .= \" {$filenameSuffix}\";\n }\n\n $result = $this->sanitizeFileName(\"{$customName} - {$periodName}\");\n }\n\n $this->info($result);\n }\n\n public function calculateFromAndToDatePeriod(\n string $frequency,\n ?Carbon $fromDate = null,\n ?Carbon $toDate = null\n ): array {\n if ($frequency === self::FREQUENCY_ONE_OFF) {\n return [\n 'fromDate' => $fromDate,\n 'toDate' => $toDate,\n ];\n }\n\n $now = Carbon::now();\n\n return match ($frequency) {\n self::FREQUENCY_DAILY => [\n 'fromDate' => $now->copy()->subDay()->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_WEEKLY => [\n 'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_MONTHLY => [\n 'fromDate' => $now->copy()->subMonths(1)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n self::FREQUENCY_QUARTERLY => [\n 'fromDate' => $now->copy()->subMonths(3)->startOfDay(),\n 'toDate' => $now->copy()->subDay()->endOfDay(),\n ],\n default => throw new InvalidArgumentException(\"Unsupported frequency: {$frequency}\"),\n };\n }\n\n private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string\n {\n $fromYear = $from->format('Y');\n $toYear = $to->format('Y');\n $differentYears = $fromYear !== $toYear;\n\n switch ($frequency) {\n case self::FREQUENCY_DAILY:\n return $from->format('j M Y');\n\n case self::FREQUENCY_QUARTERLY:\n // 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ\n $startMonth = $from->format('M');\n $endMonth = $to->copy()->subMonth();\n $endMonthName = $endMonth->format('M');\n $endMonthYear = $endMonth->format('Y');\n\n if ($differentYears) {\n return \"{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}\";\n }\n\n return \"{$startMonth} - {$endMonthName} {$toYear}\";\n\n case self::FREQUENCY_MONTHLY:\n // 'May 2025' - monthly reports are always within the same year\n return $from->format('M Y');\n\n case self::FREQUENCY_WEEKLY:\n // '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ\n $startDay = $from->format('j');\n $endDay = $to->format('j');\n $startMonth = $from->format('M');\n $endMonth = $to->format('M');\n\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n if ($startMonth !== $endMonth) {\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n return \"{$startDay} - {$endDay} {$endMonth} {$toYear}\";\n\n case self::FREQUENCY_ONE_OFF:\n // '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ\n $startDay = $from->format('j');\n $startMonth = $from->format('M');\n $endDay = $to->format('j');\n $endMonth = $to->format('M');\n\n // If same month and year, use a format like '2-31 May 2025'\n if ($startMonth === $endMonth && ! $differentYears) {\n return \"{$startDay} - {$endDay} {$startMonth} {$toYear}\";\n }\n\n // If different years, include both years\n if ($differentYears) {\n return \"{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}\";\n }\n\n // Same year but different months\n return \"{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}\";\n\n default:\n // Default format for unknown frequencies\n return $from->format('j M Y') . ' - ' . $to->format('j M Y');\n }\n }\n\n public function sanitizeFileName(string $fileName): string\n {\n return str_replace(['/', '\\\\'], '-', $fileName);\n }\n\n private function getPayload(AutomatedReportsService $automatedReportsService)\n {\n $reportResult = AutomatedReportResult::find(269);\n $automatedReport = $reportResult->getReport();\n $activityIds = [1,2,3];\n $payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(\n automatedReport: $automatedReport,\n reportResult: $reportResult,\n activityIds: $activityIds,\n );\n\n \\Illuminate\\Support\\Facades\\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));\n }\n\n private function rateLimit()\n {\n $team = Team::find(2);\n $config = $team->getCrmConfiguration();\n\n $crmResolver = app(CrmOwnerResolver::class, [\n 'team' => $team,\n 'integrationAdmin' => $team->getOwner(),\n 'providerSlug' => $config->getProviderName(),\n ]);\n\n $crmService = $crmResolver->prepareCrmService();\n\n for ($i = 0 ; $i < 3; $i++) {\n// if ($i % 25 === 0) {\n// $this->info(\"Syncing opportunity {$i}\");\n $this->info(\"Matching contact {$i}\");\n// }\n// $crmService->syncOpportunity('374720564');\n $crmService->matchByName('Robot');\n }\n }\n\n private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n\n $activities = Activity::query()\n ->where('crm_configuration_id', $config->getId())\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})\");\n\n foreach ($activities as $activity) {\n MatchActivityCrmData::dispatch($activity->getId(), $config, true);\n }\n\n $this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');\n }\n\n private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void\n {\n $activities = Activity::query()\n ->where('team_id', $teamId)\n ->whereNotNull('crm_provider_id')\n ->orderByDesc('id')\n ->limit($count)\n ->get();\n\n $this->info(\"Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs\");\n\n foreach ($activities as $activity) {\n VerifyActivityCrmTaskJob::dispatch($activity->getId());\n }\n\n $this->info('Done.');\n }\n\n private function observeRateLimitCache(int $teamId = 2): void\n {\n $team = Team::find($teamId);\n $config = $team->getCrmConfiguration();\n $key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());\n\n $value = Redis::get($key);\n $ttl = Redis::ttl($key);\n\n $this->info(\"Redis key: {$key}\");\n $this->info('Value: ' . ($value ?? '(empty)'));\n $this->info(\"TTL: {$ttl}s\");\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8968382007739132576
|
3603804443533978027
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
5
133
11
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Console\Commands;
use Carbon\Carbon;
use Carbon\CarbonImmutable;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis;
use InvalidArgumentException;
use Jiminny\Jobs\AutomatedReports\RequestGenerateAskJiminnyReportJob;
use Jiminny\Jobs\AutomatedReports\SendReportMailJob;
use Jiminny\Jobs\Crm\Delete\VerifyActivityCrmTaskJob;
use Jiminny\Jobs\Crm\MatchActivityCrmData;
use Jiminny\Jobs\JobDispatcherInterface;
use Jiminny\Models\Activity;
use Jiminny\Models\AutomatedReport;
use Jiminny\Models\AutomatedReportResult;
use Jiminny\Models\Team;
use Jiminny\Models\User;
use Jiminny\Repositories\AutomatedReportsRepository;
use Jiminny\Services\Activity\CrmOwnerResolver;
use Jiminny\Services\Kiosk\AutomatedReports\AutomatedReportsService;
use Jiminny\Services\UserPilot\UserPilotClient;
/**
* Class JiminnyDebugCommand
*
* @package Jiminny\Console\Commands
*/
class JiminnyDebugCommand extends Command
{
public const string FREQUENCY_DAILY = 'daily';
public const string FREQUENCY_WEEKLY = 'weekly';
public const string FREQUENCY_MONTHLY = 'monthly';
public const string FREQUENCY_QUARTERLY = 'quarterly';
public const string FREQUENCY_ONE_OFF = 'one_off';
protected $signature = 'jiminny:debug';
public function handle(
JobDispatcherInterface $jobDispatcher,
AutomatedReportsService $automatedReportsService,
AutomatedReportsRepository $automatedReportsRepository,
UserPilotClient $userPilotClient
): void {
// Choose ONE of the following to run, then comment out the others.
// 1) Dispatch a storm of MatchActivityCrmData jobs against team 2
$this->simulateMatchActivityStorm(teamId: 2, count: 100);
// 2) Dispatch a storm of VerifyActivityCrmTaskJob jobs (simulates DeleteCrmEntityTrait fan-out)
// $this->simulateVerifyTaskStorm(teamId: 2, count: 100);
// 3) Inspect Redis circuit-breaker state for the team's HubSpot portal
// $this->observeRateLimitCache(teamId: 2);
// 4) Make 3 synchronous matchByName calls (foreground, hits API directly)
// $this->rateLimit();
exit(1);
$report = AutomatedReport::find(71);
$last = AutomatedReportResult::query()
->where('report_id', $report->getId())
->whereIn('status', [AutomatedReportResult::STATUS_DEFAULT, AutomatedReportResult::STATUS_FAILED])
// ->where('reason', '!=', AutomatedReportResult::REASON_NOT_ENOUGH_ACTIVITIES)
->whereDate('created_at', CarbonImmutable::now()->toDateString())
->latest()
->first();
$this->info("Last: {$last->getId()}");
exit(1);
$user = User::find(143);
// $count = $automatedReportsRepository->countUserReports($user);
// $this->info("Count: {$count}");
// $count = $automatedReportsRepository->countAllUserReports($user);
// $this->info("All count: {$count}");
$payload = [
'report_type' => 'ask_jiminny',
'frequency' => 'weekly',
];
$userPilotClient->track($user, 'ask-jiminny-report-generated', $payload);
exit(1);
$now = Carbon::now()->subDay(1);
$this->info("Now: {$now->toDateTimeString()}");
$weekStart = Carbon::getWeekStartsAt();
$this->info("Now: {$weekStart}");
// $from = $now->copy()->previousWeekday()->startOfDay();
// $to = $now->copy()->previousWeekday()->endOfDay();
// $fromOld = $now->copy()->subWeeks(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subWeek()->startOfWeek();
// $toNew = $now->copy()->subWeek()->endOfWeek();
// $fromOld = $now->copy()->subMonths(1)->startOfDay();
// $toOld = $now->copy()->subDay()->endOfDay();
// $fromNew = $now->copy()->subMonthNoOverflow()->startOfMonth();
// $toNew = $now->copy()->subMonthNoOverflow()->endOfMonth();
$fromOld = $now->copy()->subMonths(3)->startOfDay();
$toOld = $now->copy()->subDay()->endOfDay();
$fromNew = $now->copy()->subQuarterNoOverflow()->startOfQuarter();
$toNew = $now->copy()->subQuarterNoOverflow()->endOfQuarter();
$this->info("From old: {$fromOld->toDateTimeString()}");
$this->info("To old: {$toOld->toDateTimeString()}");
$this->info("From new: {$fromNew->toDateTimeString()}");
$this->info("To new: {$toNew->toDateTimeString()}");
exit(1);
$report = AutomatedReport::find(71);
$job = new RequestGenerateAskJiminnyReportJob($report->getUuid());
$jobDispatcher->dispatch($job);
exit(1);
// $this->formatDate($jobDispatcher);
// $this->sendMail($jobDispatcher, $automatedReportsService);
// $this->crmService();
$this->getPayload($automatedReportsService);
exit(1);
}
private function crmService()
{
$activity = Activity::find(418141);
$team = Team::find(19);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
$crmService->createTranscriptNotes($activity);
}
private function sendMail(JobDispatcherInterface $jobDispatcher, AutomatedReportsService $automatedReportsService)
{
$reportUuid = '';
// $report = $automatedReportsService->getReportResult($reportUuid);
$report = AutomatedReportResult::find(275);
$validRecipients = $automatedReportsService->getValidRecipientUsers(
$report->getReport(),
includeJiminny: true,
);
$recipient = $validRecipients[0];
$fileName = $automatedReportsService->getReportFileName($report);
$typeName = $report->getReport()->getCustomName()
?? $automatedReportsService->getReportTypeName($report);
$teamsName = $automatedReportsService->getReportTeamsName($report);
$periodName = $automatedReportsService->getReportPeriodName($report);
$s3Path = $automatedReportsService->getMediaPath($report);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$fileName ' . PHP_EOL . print_r($fileName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$typeName ' . PHP_EOL . print_r($typeName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$teamsName ' . PHP_EOL . print_r($teamsName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$periodName ' . PHP_EOL . print_r($periodName, true));
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$s3Path ' . PHP_EOL . print_r($s3Path, true));
$jobDispatcher->dispatch(
new SendReportMailJob(
reportUuid: $report->getUuid(),
s3Path: $s3Path,
recipientEmail: $recipient['email'],
recipientName: $recipient['name'] ?? null,
fileName: $fileName,
typeName: $typeName,
teamsName: $teamsName,
periodName: $periodName,
isAskJiminny: true,
)
);
exit(1);
}
private function formatDate(JobDispatcherInterface $jobDispatcher): void
{
$customName = 'Custom report name';
// $frequency = self::FREQUENCY_DAILY;
// $frequency = self::FREQUENCY_WEEKLY;
$frequency = self::FREQUENCY_MONTHLY;
// $frequency = self::FREQUENCY_QUARTERLY;
// $frequency = self::FREQUENCY_ONE_OFF;
$period = $this->calculateFromAndToDatePeriod($frequency);
$from = $period['fromDate'];
$to = $period['toDate'];
$periodName = $this->formatReportPeriodName($frequency, $from, $to);
$filenameSuffix = null;
if ($customName) {
if ($filenameSuffix) {
$customName .= " {$filenameSuffix}";
}
$result = $this->sanitizeFileName("{$customName} - {$periodName}");
}
$this->info($result);
}
public function calculateFromAndToDatePeriod(
string $frequency,
?Carbon $fromDate = null,
?Carbon $toDate = null
): array {
if ($frequency === self::FREQUENCY_ONE_OFF) {
return [
'fromDate' => $fromDate,
'toDate' => $toDate,
];
}
$now = Carbon::now();
return match ($frequency) {
self::FREQUENCY_DAILY => [
'fromDate' => $now->copy()->subDay()->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_WEEKLY => [
'fromDate' => $now->copy()->subWeeks(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_MONTHLY => [
'fromDate' => $now->copy()->subMonths(1)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
self::FREQUENCY_QUARTERLY => [
'fromDate' => $now->copy()->subMonths(3)->startOfDay(),
'toDate' => $now->copy()->subDay()->endOfDay(),
],
default => throw new InvalidArgumentException("Unsupported frequency: {$frequency}"),
};
}
private function formatReportPeriodName(string $frequency, Carbon $from, Carbon $to): string
{
$fromYear = $from->format('Y');
$toYear = $to->format('Y');
$differentYears = $fromYear !== $toYear;
switch ($frequency) {
case self::FREQUENCY_DAILY:
return $from->format('j M Y');
case self::FREQUENCY_QUARTERLY:
// 'Jan-Mar 2025' or 'Nov 2024-Jan 2025' if years differ
$startMonth = $from->format('M');
$endMonth = $to->copy()->subMonth();
$endMonthName = $endMonth->format('M');
$endMonthYear = $endMonth->format('Y');
if ($differentYears) {
return "{$startMonth} {$fromYear} - {$endMonthName} {$endMonthYear}";
}
return "{$startMonth} - {$endMonthName} {$toYear}";
case self::FREQUENCY_MONTHLY:
// 'May 2025' - monthly reports are always within the same year
return $from->format('M Y');
case self::FREQUENCY_WEEKLY:
// '4 - 8 Aug 2025', '27 Oct - 3 Nov 2025', or '28 Dec 2024 - 3 Jan 2025' if years differ
$startDay = $from->format('j');
$endDay = $to->format('j');
$startMonth = $from->format('M');
$endMonth = $to->format('M');
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
if ($startMonth !== $endMonth) {
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
}
return "{$startDay} - {$endDay} {$endMonth} {$toYear}";
case self::FREQUENCY_ONE_OFF:
// '2 May-31 May 2025' or '15 Dec 2024-15 Jan 2025' if years differ
$startDay = $from->format('j');
$startMonth = $from->format('M');
$endDay = $to->format('j');
$endMonth = $to->format('M');
// If same month and year, use a format like '2-31 May 2025'
if ($startMonth === $endMonth && ! $differentYears) {
return "{$startDay} - {$endDay} {$startMonth} {$toYear}";
}
// If different years, include both years
if ($differentYears) {
return "{$startDay} {$startMonth} {$fromYear} - {$endDay} {$endMonth} {$toYear}";
}
// Same year but different months
return "{$startDay} {$startMonth} - {$endDay} {$endMonth} {$toYear}";
default:
// Default format for unknown frequencies
return $from->format('j M Y') . ' - ' . $to->format('j M Y');
}
}
public function sanitizeFileName(string $fileName): string
{
return str_replace(['/', '\\'], '-', $fileName);
}
private function getPayload(AutomatedReportsService $automatedReportsService)
{
$reportResult = AutomatedReportResult::find(269);
$automatedReport = $reportResult->getReport();
$activityIds = [1,2,3];
$payload = $automatedReportsService->getAskJiminnyGenerateReportPayload(
automatedReport: $automatedReport,
reportResult: $reportResult,
activityIds: $activityIds,
);
\Illuminate\Support\Facades\Log::channel('custom_channel')->info('$payload ' . PHP_EOL . print_r($payload, true));
}
private function rateLimit()
{
$team = Team::find(2);
$config = $team->getCrmConfiguration();
$crmResolver = app(CrmOwnerResolver::class, [
'team' => $team,
'integrationAdmin' => $team->getOwner(),
'providerSlug' => $config->getProviderName(),
]);
$crmService = $crmResolver->prepareCrmService();
for ($i = 0 ; $i < 3; $i++) {
// if ($i % 25 === 0) {
// $this->info("Syncing opportunity {$i}");
$this->info("Matching contact {$i}");
// }
// $crmService->syncOpportunity('374720564');
$crmService->matchByName('Robot');
}
}
private function simulateMatchActivityStorm(int $teamId = 2, int $count = 100): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$activities = Activity::query()
->where('crm_configuration_id', $config->getId())
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} MatchActivityCrmData jobs (portal={$config->getId()})");
foreach ($activities as $activity) {
MatchActivityCrmData::dispatch($activity->getId(), $config, true);
}
$this->info('Done. Watch logs and run jiminny:debug observeRateLimit to inspect cache state.');
}
private function simulateVerifyTaskStorm(int $teamId = 2, int $count = 100): void
{
$activities = Activity::query()
->where('team_id', $teamId)
->whereNotNull('crm_provider_id')
->orderByDesc('id')
->limit($count)
->get();
$this->info("Dispatching {$activities->count()} VerifyActivityCrmTaskJob jobs");
foreach ($activities as $activity) {
VerifyActivityCrmTaskJob::dispatch($activity->getId());
}
$this->info('Done.');
}
private function observeRateLimitCache(int $teamId = 2): void
{
$team = Team::find($teamId);
$config = $team->getCrmConfiguration();
$key = sprintf('hubspot:ratelimit:portal:%d', $config->getId());
$value = Redis::get($key);
$ttl = Redis::ttl($key);
$this->info("Redis key: {$key}");
$this->info('Value: ' . ($value ?? '(empty)'));
$this->info("TTL: {$ttl}s");
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18305
|
792
|
9
|
2026-05-11T11:09:59.300005+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497799300_m1.jpg...
|
PhpStorm
|
faVsco.js – laravel.log
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp§ Preparation for Refi... in 51 mDEV (docker)-zshDOCKERcompiledeventsroutesviews₴81DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny: debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5ffmpeg100% <78• Mon 11 May 14:09:58T₴1₴86-zsh+2.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
NULL
|
-3007434453721805799
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp§ Preparation for Refi... in 51 mDEV (docker)-zshDOCKERcompiledeventsroutesviews₴81DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny: debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5ffmpeg100% <78• Mon 11 May 14:09:58T₴1₴86-zsh+2.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
18303
|
NULL
|
NULL
|
NULL
|
|
18306
|
793
|
8
|
2026-05-11T11:09:59.331967+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497799331_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-h PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limitProiectC) TrackAutomated ReportGeneratedzventonp= custom.logT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ong= nuospor-lournal-poll.log©) HandleHub› onounit.xm© RateLimitExceos ttt.jsE oauth-private.key© PaginationConfia.phdE oauth-public.keyclass J1minnyDebuqcommand extends CommandE storageE supervisord.pidtext-relav.ison363v w tests> Featurelintearationa Servicesv 7UniN ComoonentiM ConcoleiM ContractsIDTOEnumsm EventsD Exceptions©) EmailActivityImportExc/w HandlerTlest.pnp© RateLimitExceptionTes0) fixturesGuardsW Helpersm) HttoIntearationsalinteractionsaHobs> ActivitvM AiAutomation> Audidv MAutomatedReports( CreateResultsTest , 391© RequestGenerateA, 392( RequestGenerateR, 395( SendRenortEypirine 394C) SendRenort.lohTes@ SendReportMailJob( SendRenortNotGen 397Tm Cnlondarm CrmlM NonlDicke• MMailbayTacts naccod. 12 (todav 12:02private function natelamutfor (Si = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {scnis"pinto syneine opporcunity 11Sthis->info( string: "Matching contact {$i}"):scrmservice->syncupporcun1cy 574/20564'scrmservice->macchbyname "kobot"1 usageprivate function simulateMatchActivityStorm(int SteamId = 2, int Scount = 100): voidSconfio = steam->oetcrmconflourationobSactivities = Activitv:quervoerm confiauration id' Sconfio->aetidon->orderBvDescdi->Uimit(Scount)->getO:$this->info( string: "Dispatching {Sactivities->count()} MatchActivityCrmData jobs (portal={$config->getId()})");foreach (Sactivities as $activity) {MatchActivityCrmData::dispatch( ...arguments: Sactivity->getId, $config, true):no usagesprivate function simulateVerifyTaskStorm(int SteamId = 2. int $count = 100): voidSactavitles = Activity::quervol>where co'team_1d', Steamid)'cem provider id')->net05foneach (Sactivities as Cactivitv) !Hudspol/serwice.pnp= custom.logm| A5 A133 X11 ^ VEPreparation tor kerl.. In o1m100% 5• Mon 11 May 14:09:58&console [pRODIA console [EUiA console [STAGING]Cc W.*0: Jiminny Console \Commands \Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforeCommandInMb" :60.0, "memoryIIIoomIINoelAsooelno hm B h0: Jiminny Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed0: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true, "se0: [ EsUpdateTarget ] Update single target {"target": "activities", "purpose": "searchable-observeodate" "entitvld":615092, "correlation id"."f33d47ch-76c6-4c)0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":61collectionKev":"activities-fon-undate-orioritv" "withP0: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{("id":1004102,0: [SocialAccountService] Fetching token {"socialAccountId":1499p idi:1705.0: [SocialAccountService] Token retrieved {"socialAccountId":14990: [EncryptedTokenManager] Generating access token. {"mode":"lec473d/7ch-7kck-he27.a4M1c48ch£400/22dil IItnaco idil.1705/a905-h2£hche90-hh0: [CrmOwnerResolver] Integration owner matched as CRM Owner f"crm_provs0: [Prospect match] Cache miss, calling the API {"identifiert0: [Hubspotl Failed to fetch contact {"email":"nikolay.nikolov@jiminn0: [Prospect match] API returned empty result.NING: [Hubspotl No retry-after headerNING: [Hubspotl Received k29 from APT {"te|"•| "You have reached voursecondly limit.76c6-4c27-a641-48cbf69e623d" "trace id"0: [HandleHubspotRateLimitl Rate limit caught. releasing iob with delay {".0: [MatchActivityCrmData] Starting CRM data matching {"activity":6144360: [ EsUpdateTarget 1 Uodate single target §"target"entityid":614436* "correlation_1d":"ccafe865-7885-47"AsvncUpdateFlasticSearch 1 Entity add0: [MatchActivitvCrmDatal Particinants old state {"activitv":614436 "narticir1002751"user 1d".nul"contact 1d".nul"lead 1d".nul"10":100275[SocialAccountServicel Fetching token {"0: SocialAccountServicel Token retrieved "socialAccountId"• 149[EncryptedTokenManager] Generating access token. {"mode0: CrmOwnerResolver] Intearation owner matched as CRM Owner[Prospect match] Cache / local search hit 1"io0: [Prospect match] cached empty result[HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class0: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,[ EsUpdateTarget ] Update single target {"target":"activities" "purpose":"searchable-observer-update'• [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities" "entityId":61[MatchActivityCrmData] Participants old state {"activity":614382,"participa0: [SocialAccountService] Fetching token {"socialAccountId":1499(EncryptedTokenManager] Generating access token. {"mode":"legac0: [CrmOwnerResolverl Integration owner matched as CRM Owner {"crm[Prospect matchl Cache / local search hit {"identifierfuondlolnbeno+Dotol &ms+l Doto 14ms+...
|
NULL
|
-8139921376645676375
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-h PhostormVIewINavicarecodeFV faVsco.js?9 JY-20725-handle-HS-search-rate-limitProiectC) TrackAutomated ReportGeneratedzventonp= custom.logT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ong= nuospor-lournal-poll.log©) HandleHub› onounit.xm© RateLimitExceos ttt.jsE oauth-private.key© PaginationConfia.phdE oauth-public.keyclass J1minnyDebuqcommand extends CommandE storageE supervisord.pidtext-relav.ison363v w tests> Featurelintearationa Servicesv 7UniN ComoonentiM ConcoleiM ContractsIDTOEnumsm EventsD Exceptions©) EmailActivityImportExc/w HandlerTlest.pnp© RateLimitExceptionTes0) fixturesGuardsW Helpersm) HttoIntearationsalinteractionsaHobs> ActivitvM AiAutomation> Audidv MAutomatedReports( CreateResultsTest , 391© RequestGenerateA, 392( RequestGenerateR, 395( SendRenortEypirine 394C) SendRenort.lohTes@ SendReportMailJob( SendRenortNotGen 397Tm Cnlondarm CrmlM NonlDicke• MMailbayTacts naccod. 12 (todav 12:02private function natelamutfor (Si = 0 ; $i < 3; $i++) {if ($i % 25 === 0) {scnis"pinto syneine opporcunity 11Sthis->info( string: "Matching contact {$i}"):scrmservice->syncupporcun1cy 574/20564'scrmservice->macchbyname "kobot"1 usageprivate function simulateMatchActivityStorm(int SteamId = 2, int Scount = 100): voidSconfio = steam->oetcrmconflourationobSactivities = Activitv:quervoerm confiauration id' Sconfio->aetidon->orderBvDescdi->Uimit(Scount)->getO:$this->info( string: "Dispatching {Sactivities->count()} MatchActivityCrmData jobs (portal={$config->getId()})");foreach (Sactivities as $activity) {MatchActivityCrmData::dispatch( ...arguments: Sactivity->getId, $config, true):no usagesprivate function simulateVerifyTaskStorm(int SteamId = 2. int $count = 100): voidSactavitles = Activity::quervol>where co'team_1d', Steamid)'cem provider id')->net05foneach (Sactivities as Cactivitv) !Hudspol/serwice.pnp= custom.logm| A5 A133 X11 ^ VEPreparation tor kerl.. In o1m100% 5• Mon 11 May 14:09:58&console [pRODIA console [EUiA console [STAGING]Cc W.*0: Jiminny Console \Commands \Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforeCommandInMb" :60.0, "memoryIIIoomIINoelAsooelno hm B h0: Jiminny Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed0: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true, "se0: [ EsUpdateTarget ] Update single target {"target": "activities", "purpose": "searchable-observeodate" "entitvld":615092, "correlation id"."f33d47ch-76c6-4c)0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":61collectionKev":"activities-fon-undate-orioritv" "withP0: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{("id":1004102,0: [SocialAccountService] Fetching token {"socialAccountId":1499p idi:1705.0: [SocialAccountService] Token retrieved {"socialAccountId":14990: [EncryptedTokenManager] Generating access token. {"mode":"lec473d/7ch-7kck-he27.a4M1c48ch£400/22dil IItnaco idil.1705/a905-h2£hche90-hh0: [CrmOwnerResolver] Integration owner matched as CRM Owner f"crm_provs0: [Prospect match] Cache miss, calling the API {"identifiert0: [Hubspotl Failed to fetch contact {"email":"nikolay.nikolov@jiminn0: [Prospect match] API returned empty result.NING: [Hubspotl No retry-after headerNING: [Hubspotl Received k29 from APT {"te|"•| "You have reached voursecondly limit.76c6-4c27-a641-48cbf69e623d" "trace id"0: [HandleHubspotRateLimitl Rate limit caught. releasing iob with delay {".0: [MatchActivityCrmData] Starting CRM data matching {"activity":6144360: [ EsUpdateTarget 1 Uodate single target §"target"entityid":614436* "correlation_1d":"ccafe865-7885-47"AsvncUpdateFlasticSearch 1 Entity add0: [MatchActivitvCrmDatal Particinants old state {"activitv":614436 "narticir1002751"user 1d".nul"contact 1d".nul"lead 1d".nul"10":100275[SocialAccountServicel Fetching token {"0: SocialAccountServicel Token retrieved "socialAccountId"• 149[EncryptedTokenManager] Generating access token. {"mode0: CrmOwnerResolver] Intearation owner matched as CRM Owner[Prospect match] Cache / local search hit 1"io0: [Prospect match] cached empty result[HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class0: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,[ EsUpdateTarget ] Update single target {"target":"activities" "purpose":"searchable-observer-update'• [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities" "entityId":61[MatchActivityCrmData] Participants old state {"activity":614382,"participa0: [SocialAccountService] Fetching token {"socialAccountId":1499(EncryptedTokenManager] Generating access token. {"mode":"legac0: [CrmOwnerResolverl Integration owner matched as CRM Owner {"crm[Prospect matchl Cache / local search hit {"identifierfuondlolnbeno+Dotol &ms+l Doto 14ms+...
|
18304
|
NULL
|
NULL
|
NULL
|
|
18307
|
792
|
10
|
2026-05-11T11:10:03.895539+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497803895_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6522339035140287979
|
-8348248415050200704
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 mDEV (docker)-zshDOCKERcompiledeventsroutesviews-₴81DEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5ffmpeg100% <78• Mon 11 May 14:10:03181-zsh+-₴862.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18308
|
793
|
9
|
2026-05-11T11:10:04.830341+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497804830_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3299086470291663550
|
-8349389703787247352
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
PhostormVIewINavicareCodeWindowFV faVsco.js°9 JY-20725-handle-HS-search-rate-linProiect v© BatchSyncCollectolT SyncCrmEntitiesTrait.phpC) CachedCrmServiceDecorator.ongDeleteCrmEntityTrait.phpe balchsynckealsse© ClosedDealStagesS © RateLimitExceDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phrclass Cllent extends Baseclient 1mpLements HubspotclientintertaceC) FieldT vpeconvertee Hubspotclientinterc) Hubspotlokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalizec) Service.onrC)SvncFieldAction.onC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM Acceccors•MAnConfigDDTO• M SiltersD Jobs• M ProcnectSoarchStr.W sevice lraits© DataClient.php© DecorateActivity.ph© LocalSearch.phpu Localsearchinteria© RemoteSearch.phpc) Service.phpv _ Listenersc) ConvertLeadActivitc) PurceLookuocache> M Metadata> 2 MiarationPioedrivev Salesforce• D Fields• M OnnortunitvMatcheMOnnortunitvSvneStM ProsneetSearchStr.M ServiceTraitcC) Client nhr© DecorateActivity.ph. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phpprivate function batchRead0bjects(string SobjectType, array $crmIds, array $fields): arrayif (empty($crmIds)) {recurn wschis-›vauioarebarchsize sobnecclvoe, scrmlosrsthis->ensureVal1dtokeno:trySbatchConfig = $this->createBatchConfiquration(SobiectTvpe):SbatchReadReguest = $this->prepareBatchRequest($batchConfia. ScrmIds. Sfields):Sresponse= shatchtonfio'ao1'->readShatchReadRequest):Sthis-›validateAniResponse Sresponse. Sobiecttvoe):Sresults = Sthis->orocessAniResults(Sresponse)Sthis->loaBatchResults(SobiectTvne. Scrmids. Sresults):return Sresults,} catch (\Throwable $e) {Sthis->handleBatchError($e, $objectType, $crmIds):private function validateBatchSize(string SobjectType, array ScrmIds): voidif (count(ScrmIds) > 100) {orivate function createbatchconflourationistrino sobectivoe): arravSconfiqurations = 1'inoutClass' => \HubSnot\CLient\Crm\Deals\Mode1|SimolePublic0biectId::classl'ani' => Sthis->aetNewinstanceO->crmO->deals@->batchAo.ou"comnaniest =>!hatchReadReques+l => new HuhSnot Client Crm.Comnanies ModelRatchReadTnnutSimnlePuhlic0hiecttdo.Tacts naccod. 12 (todav 12:02Preparation tor kerl… In oum100% 5• Mon 11 May 14:10:04&console [pRODI& console (EuTA console [STAGING]HubSpot/Service.phpProviderkateLimiter.ongm |A2 A67 X3 A VMI / 1H4H1= custom.log120Cc W.*0: Jiminny Console \Commands \Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforeCommandInMb" :60.0, "memoryIIIoomIINoelAsooelno hm B h0: Jiminny Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed".0• MatchActivitvCrmDatal Startina CRM data matchina "activity":615092 "remote search"»true "se'0: [ EsUpdateTarget ] Update single target {"target": "activities", "purpose"• "Searchab Le-observelndate" "entitvld":615092} "cornelatiion id"."f33d47ch-76c6-4cl0: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":6150collectionKev":"activities-fon-undate-orioritv" "withP0: [MatchActivityCrmData] Participants old state ("activity":615092, "participants":L1 10.100410210: [SocialAccountService] Fetching token {"socialAccountId":1499co idil:1705.0: [SocialAccountService] Token retrieved {"socialAccountid":149%,0: [EncryptedTokenManager] Generating access token. {"mode":"lec433d/7ch-76ck-he27.a4h1_4Rch£400/22dil IItnaco idil.1705/a005-h04hche92-hh0: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provi0: [Prospect match] Cache miss, calling the API {"identifier type":"0: [Hubspotl Failed to fetch contact {"email":"nikolay.nikolov@jiminn0: [Prospect match] API returned empty result.NING: [Hubspotl No retry-after headerNING: [Hubspotl Received k29 from APT {"te|"•| "You have reached voursecondly limit.76c6-4c27-a641-48cbf69e623d" "trace id"0: [HandleHubspotRateLimitl Rate limit caught. releasing iob with delay {"i0: [MatchActivitvCrmDatal Starting CRM data matching {"activity":614436.0: [ EsUpdateTarget 1 Uodate single target §"target"entatvid":614436* *"correlation1d":"ccafe865-7885-47"AsvncUpdateFlasticSearch 1 Entity add0: [MatchActivitvCrmDatal Particinants old state {"activitv":614436 "narticir•1002751"user 1d".nul"contact id".nul"lead 1d".nul"10":100275[SocialAccountServicel Fetching token {"0: SocialAccountServicel Token retrieved "socialAccountId"• 149[EncryptedTokenManager] Generating access token. {"mode0: CrmOwnerResolver] Intearation owner matched as CRM Owner[Prospect match] Cache / local search hit 1"i0n• Procnect matchl cached emntv nocult[HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class0: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":t/[ EsUpdateTarget ] Update single target {"target":"activities" "purpose":"searchable-observer-update'"entityId":614382} {"correlation_id":"f00a4506-adfe-4fc[MatchActivityCrmData] Participants old state {"activity":614382,"participa0: [EncryptedTokenManager] Generating access token. {"mode": "legac0: [CrmOwnerResolverl Integration owner matched as CRM Owner {"crm0: [Prospect matchl Cache / local search hit {"identifier_type"."email" "identifien"."nikolay.nikolov@iimin0: [HandleHubspotRateLimitl Rate limit...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18309
|
792
|
11
|
2026-05-11T11:10:06.115874+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497806115_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8956692732016058251
|
-8204340751569409078
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 mDEV (docker)-zshDOCKERcompiledeventsroutesviewsDEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5ffmpeg100% <8• Mon 11 May 14:10:05T₴1₴86-zsh+2.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
18307
|
NULL
|
NULL
|
NULL
|
|
18311
|
793
|
10
|
2026-05-11T11:10:09.644774+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497809644_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.7430186,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.75166225,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.7603058,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.97539896,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6538278410563453966
|
6378759348926941284
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification...
|
18308
|
NULL
|
NULL
|
NULL
|
|
18310
|
792
|
12
|
2026-05-11T11:10:09.673520+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497809673_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18312
|
793
|
11
|
2026-05-11T11:10:11.962704+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497811962_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.7430186,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.75166225,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.7603058,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.97539896,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"bounds":{"left":0.96210104,"top":0.10933759,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.10774142,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.10774142,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"bounds":{"left":0.4943484,"top":0.10614525,"width":0.5056516,"height":0.89385474},"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18313
|
792
|
13
|
2026-05-11T11:10:17.221642+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497817221_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-964503098742680800
|
-8740352678700184768
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 m100% <]8• Mon 11 May 14:10:17181DEV (docker)-zshDOCKERcompiledeventsroutesviews₴81DEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"2.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
18310
|
NULL
|
NULL
|
NULL
|
|
18314
|
793
|
12
|
2026-05-11T11:10:47.633503+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497847633_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.7430186,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.75166225,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.7603058,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.97539896,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"bounds":{"left":0.96210104,"top":0.10933759,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.10774142,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.10774142,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"bounds":{"left":0.5465425,"top":0.10614525,"width":0.45345747,"height":0.89385474},"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
18312
|
NULL
|
NULL
|
NULL
|
|
18315
|
792
|
14
|
2026-05-11T11:10:48.884724+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497848884_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18317
|
793
|
13
|
2026-05-11T11:10:57.894366+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497857894_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicareCodeWindowFV faVsco.js°9 JY-2 PhostormVIewINavicareCodeWindowFV faVsco.js°9 JY-20725-handle-HS-search-rate-linroledey© BatchSyncCollectolC) CachedCrmServiceDecorator.ongDeleteCrmEntityTrait.phpe balchsynckealssec clientone© ClosedDealStagesS © RateLimitExcepDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phrC) FieldT vpeconvertee Hubspotclientinterc) Hubspot Tokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalizec) Service.onrC)SvncFieldAction.onC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM Acceccors• D ConfigD DTO> M SiltersJobs• M ProcnectSoarchStreW service lralts© DataClient.php© DecorateActivity.ph(e)LocalSearch.onpu Localsearchinteria© RemoteSearch.phpc) Service.phpv W Listeners© ConvertLeadActivitc) PurceLookuocache> M Metadata> Miaration> = Pioedrivev Salesforce• D FieldsM OnnortunitvMatcheMOnnortunitvSvneStM ProsneetSearchStr.• M ServiceTraitcC) Client nhr© DecorateActivity.ph. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phpTacts naccod. 12 (todav 12:02class Client extends Basecllent impLements HubspotcllentintertaceSthis->executeRequest(fn • => $this->getNewInstance@->crm0->...);* atemplate T* apanam callable: T $apiCall* drexurn* ochrows kateL1m1ctxcepczonorivate function executeRequestcallable SapicaloScachekev = sthis->qetRateLim1tcacheKevo:ScachedRetrvAfter = Redis:.det Scachekev):1+ us strino scachedRetrvAfter) vx 1s numericScachedRetrvAfter)) <throw new RateLimitExcentiong'Hubspot rate limit (cached circuit-breaker)',Gint) ScachedRetrvAfter.tryneturn Canicalld} catch (Throwable $e) {if (Sthis->isHubspotRateLimit(Se)) {SretryAfter = Sthis->parseRetryAfter($e):Redis::setex($cacheKey, SretryAfter, (string) $retryAfter):Sthis->loq->warning('[Hubspot] Received 429 from API'. [ttoom idl= sth1s->cont10->team1d'config id'=> Sthis->config->qetIdO."retry after' => Sretrvafter.= Sthis-›parseMessage(Se).=> $e->qetMessage@.throw new RateLimitExcention( message: 'Hubspot returned 429' SretrvAfter. Se):throw Se:lucaneHudspol/serwice.pnpProviderkateLimiter.phgA2/67 V3 AMI / 1011THH1l I11Preparation tor kerl…. In oum100% 1• Mon 11 May 14:10:57= custom.loglaravel.log&console [pRODIA console [EUiconsole [STAGINGICc W.*11: 08:4511local.INFO: Jiminny \Console\Commands\Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforecon11: 08:451111•08•467|local.INFO: Jiminny \Console\Commands \Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_config11•09•121|local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_i11[PHONE]1 INEO. AsvnclndateSlasticSeanch Entity added to Redis Zist "entityIyne" "activities" "entityId" :615092"welueeelolnKevmomnopeenelelen11•00•121local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_idSocialAccountCenvicol Cetchina token «icocialAcolocal.INF0: [SocialAccountService] Token retrieved {"socialAccountId":1499,"pr11:09:12] local.INF0: [EncryptedTokenManager] Generating access toker11.07.121Local. Inru.urmuwnerkesolver Incegracion owner macched as ukn uwner crn oroowner":148,"team_id":2} {"correlation id":"f33d11:09:120[Prospect match] Cache miss11:09:13]local.INF0: [Hubspot] Failed to fetch contact {"email":"nikolay.nikolov@jimin11:09:151local.INFO: [Prospect match] API returned empty11:04:15|10:09:1501Local.WARNING: HUbSpOt NOlocal.WARNING: [Hubspotl ReceivedExceptionsBadRequest" "me'POST httos://aoi.huerror", "message":"You nave reached11: 09:131Local.INFO:HandLeHubspotRateLimit Rate Limit11:09:14J11: 09:141111: 09:14111: 09:141Matchactivitvirmbatal11: 09 :14Local. INFO:[SocialAccountService][SocialAccountServicel11: 09:147local. TNFO:[EncryptedTokenManager] Generating access token"crm ownen":148 "team id":2, "correlation id"."ccafi11: 09:147|Zocal. TNFO.[Prospect match] Cache / local search hitrrelation_id":"ccaf.11• 00 • 1411Pracnect matchll cached emntv necul+ny neyt matchina method uidentifien tvnoll."lemanl" "identifionl."nikolav nakolovd"11 • 00 • 1/7local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny \Jobs\\Crm\\MatchActivityCrmData","attempts"::MatchActivitvêrmhatal Stantina CPM data matchina Siactivity".4143821mote seanchitoup "cet confiaunation".? "old ctato".S"lead idi»nì11• 09•141local.INF0: [ EsUpdateTarget ] Update single target {"target":"activities" "purpose":"searchable-observer-update" "entityId":614382} {"correlation i"AcvnclindateFlacticSeanch l Entitv added to Pedic lic+ SientitvTvnel.llactivitioci lentitvTdi.41438211• 09•141local.INF0: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead idҐSocialAccountSenvicel Fotchina token SicocialAccounttd".1400local.INF0: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provlocal.INF0: [EncryptedTokenManager] Generating access tokerLocatner umuwnerkesol ver incegamon owner marched as ki uwer "com provder" "nuospor "com owner"H14o, tea11:09:14] local.INF0: [Prospect match] Cache / local search hit {"identifier11:09:141 local.INF0: [Prospect matchl cached empty result - no APT calls. try next matching method {"identifier type"."email" "identifier"."nikolTuondlolnbeno+Dotol &md+11:09:141LocaL.INF0: Matchactzvityci11: 09:141Asvncuodate.l10: 09 :14110: 09 :141LocaLINFO:SoctalAccounts11: 09 • 14111: 09•147Local. TNFO:lEncrvotedTokeni11: 09:141 Local. TNF0CrmOwnerResolv...
|
NULL
|
-8548818504029116669
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicareCodeWindowFV faVsco.js°9 JY-2 PhostormVIewINavicareCodeWindowFV faVsco.js°9 JY-20725-handle-HS-search-rate-linroledey© BatchSyncCollectolC) CachedCrmServiceDecorator.ongDeleteCrmEntityTrait.phpe balchsynckealssec clientone© ClosedDealStagesS © RateLimitExcepDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phrC) FieldT vpeconvertee Hubspotclientinterc) Hubspot Tokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalizec) Service.onrC)SvncFieldAction.onC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM Acceccors• D ConfigD DTO> M SiltersJobs• M ProcnectSoarchStreW service lralts© DataClient.php© DecorateActivity.ph(e)LocalSearch.onpu Localsearchinteria© RemoteSearch.phpc) Service.phpv W Listeners© ConvertLeadActivitc) PurceLookuocache> M Metadata> Miaration> = Pioedrivev Salesforce• D FieldsM OnnortunitvMatcheMOnnortunitvSvneStM ProsneetSearchStr.• M ServiceTraitcC) Client nhr© DecorateActivity.ph. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phpTacts naccod. 12 (todav 12:02class Client extends Basecllent impLements HubspotcllentintertaceSthis->executeRequest(fn • => $this->getNewInstance@->crm0->...);* atemplate T* apanam callable: T $apiCall* drexurn* ochrows kateL1m1ctxcepczonorivate function executeRequestcallable SapicaloScachekev = sthis->qetRateLim1tcacheKevo:ScachedRetrvAfter = Redis:.det Scachekev):1+ us strino scachedRetrvAfter) vx 1s numericScachedRetrvAfter)) <throw new RateLimitExcentiong'Hubspot rate limit (cached circuit-breaker)',Gint) ScachedRetrvAfter.tryneturn Canicalld} catch (Throwable $e) {if (Sthis->isHubspotRateLimit(Se)) {SretryAfter = Sthis->parseRetryAfter($e):Redis::setex($cacheKey, SretryAfter, (string) $retryAfter):Sthis->loq->warning('[Hubspot] Received 429 from API'. [ttoom idl= sth1s->cont10->team1d'config id'=> Sthis->config->qetIdO."retry after' => Sretrvafter.= Sthis-›parseMessage(Se).=> $e->qetMessage@.throw new RateLimitExcention( message: 'Hubspot returned 429' SretrvAfter. Se):throw Se:lucaneHudspol/serwice.pnpProviderkateLimiter.phgA2/67 V3 AMI / 1011THH1l I11Preparation tor kerl…. In oum100% 1• Mon 11 May 14:10:57= custom.loglaravel.log&console [pRODIA console [EUiconsole [STAGINGICc W.*11: 08:4511local.INFO: Jiminny \Console\Commands\Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforecon11: 08:451111•08•467|local.INFO: Jiminny \Console\Commands \Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_config11•09•121|local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_i11[PHONE]1 INEO. AsvnclndateSlasticSeanch Entity added to Redis Zist "entityIyne" "activities" "entityId" :615092"welueeelolnKevmomnopeenelelen11•00•121local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_idSocialAccountCenvicol Cetchina token «icocialAcolocal.INF0: [SocialAccountService] Token retrieved {"socialAccountId":1499,"pr11:09:12] local.INF0: [EncryptedTokenManager] Generating access toker11.07.121Local. Inru.urmuwnerkesolver Incegracion owner macched as ukn uwner crn oroowner":148,"team_id":2} {"correlation id":"f33d11:09:120[Prospect match] Cache miss11:09:13]local.INF0: [Hubspot] Failed to fetch contact {"email":"nikolay.nikolov@jimin11:09:151local.INFO: [Prospect match] API returned empty11:04:15|10:09:1501Local.WARNING: HUbSpOt NOlocal.WARNING: [Hubspotl ReceivedExceptionsBadRequest" "me'POST httos://aoi.huerror", "message":"You nave reached11: 09:131Local.INFO:HandLeHubspotRateLimit Rate Limit11:09:14J11: 09:141111: 09:14111: 09:141Matchactivitvirmbatal11: 09 :14Local. INFO:[SocialAccountService][SocialAccountServicel11: 09:147local. TNFO:[EncryptedTokenManager] Generating access token"crm ownen":148 "team id":2, "correlation id"."ccafi11: 09:147|Zocal. TNFO.[Prospect match] Cache / local search hitrrelation_id":"ccaf.11• 00 • 1411Pracnect matchll cached emntv necul+ny neyt matchina method uidentifien tvnoll."lemanl" "identifionl."nikolav nakolovd"11 • 00 • 1/7local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny \Jobs\\Crm\\MatchActivityCrmData","attempts"::MatchActivitvêrmhatal Stantina CPM data matchina Siactivity".4143821mote seanchitoup "cet confiaunation".? "old ctato".S"lead idi»nì11• 09•141local.INF0: [ EsUpdateTarget ] Update single target {"target":"activities" "purpose":"searchable-observer-update" "entityId":614382} {"correlation i"AcvnclindateFlacticSeanch l Entitv added to Pedic lic+ SientitvTvnel.llactivitioci lentitvTdi.41438211• 09•141local.INF0: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead idҐSocialAccountSenvicel Fotchina token SicocialAccounttd".1400local.INF0: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provlocal.INF0: [EncryptedTokenManager] Generating access tokerLocatner umuwnerkesol ver incegamon owner marched as ki uwer "com provder" "nuospor "com owner"H14o, tea11:09:14] local.INF0: [Prospect match] Cache / local search hit {"identifier11:09:141 local.INF0: [Prospect matchl cached empty result - no APT calls. try next matching method {"identifier type"."email" "identifier"."nikolTuondlolnbeno+Dotol &md+11:09:141LocaL.INF0: Matchactzvityci11: 09:141Asvncuodate.l10: 09 :14110: 09 :141LocaLINFO:SoctalAccounts11: 09 • 14111: 09•147Local. TNFO:lEncrvotedTokeni11: 09:141 Local. TNF0CrmOwnerResolv...
|
18312
|
NULL
|
NULL
|
NULL
|
|
18316
|
792
|
15
|
2026-05-11T11:10:57.910799+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497857910_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 mDEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5100% <78• Mon 11 May 14:10:57181-zsh+screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
NULL
|
-5844766314848603347
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 mDEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5100% <78• Mon 11 May 14:10:57181-zsh+screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
18315
|
NULL
|
NULL
|
NULL
|
|
18319
|
793
|
14
|
2026-05-11T11:11:01.351474+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497861351_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicareCodeFV faVsco.js°9 JY-20725-h PhostormVIewINavicareCodeFV faVsco.js°9 JY-20725-handle-HS-search-rate-Iiyroledey© BatchSyncCollectole balchsynckealssec clientone© ClosedDealStagesS © RateLimitExceDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phrC) FieldT vpeconvertee Hubspotclientinterc) Hubspot Tokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalizec) Service.onrC)SvncFieldAction.onC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM AcceccorsConfigD DTO> M SiltersJobs• M ProcnectSoarchStreW service lralts© DataClient.php© DecorateActivity.ph(e)LocalSearch.onpu Localsearchinteria© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache> M Metadata> Miarationa Pioedrivev Salesforce• D FieldsM OnnortunitvMatcheMOnnortunitvSvneStM ProsneetSearchStr.• M ServiceTraitcC) Client nhr© DecorateActivity.ph. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phplucaneTacts naccod. 12 (todav 12:02WindowC) CachedCrmServiceDecorator.ongT DeleteCrmEntityTrait.phpclass Client extends Basecllent impLements HubspotcllentintertaceSthis->executeRequest(fn • => $this->getNewInstance@->crm0->...);* atemplate T* apanam callable: T $apiCall* drexurn* ochrows kateL1m1ctxcepczonorivate function executeRequestcallable SapicaloScachekev = sthis->qetRateLim1tcacheKevo:ScachedRetrvAfter = Redis:.det Scachekev):1+ us strinoscachedRetrvAfter)vx 1s_numericScachedRetrvAfter)) <throw new RateLimitExcentiong'Hubspot rate limit (cached circuit-breaker)',Gint) ScachedRetrvAfter.tryneturn Canicalld} catch (Throwable $e) {if (Sthis->isHubspotRateLimit(Se)) {SretryAfter = $this->parseRetryAfter($e);Redis::setex($cacheKey, SretryAfter, (string) $retryAfter):Sthis->loq->warning('[Hubspot] Received 429 from API'. [ttoom idl= sth1s->cont10->team1d'config id'=> Sthis->config->qetIdO."retry after' => Sretrvafter= Sthis-›parseMessage(Se).= Se->qetMessageorthrow new RateLimitExcention( message: 'Hubspot returned 429' SretrvAfter. Se);throw Se:Hudspol/serwice.pnpProviderkateLimiter.phgA2/67 V3 APreparation tor kerl…. In oum100% 1• Mon 11 May 14:11:01&console [pRODlA console [EUiconsole [STAGINGIш 1 шuш1l I11= custom.log=laravel.log XCc W.*11: 08:4511local.INFO: Jiminny \Console\Commands\Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforecon11: 08:451111•08•467|local.INFO: Jiminny \Console\Commands \Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_config11•09•121|local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_i11[PHONE]1 INEO. AsvnclndateSlasticSeanch Entity added to Redis Zist "entityIyne" "activities" "entityId" :615092"welueeelolnKevmeepeerelelen11•00•121local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_idSocialAccountCenvicol Cetchina token «icocialAcolocal.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"p)11:09:12] local.INF0: [EncryptedTokenManager] Generating access toker11.07.141Local. Inru.urmuwnerkesolver Incegracion owner macched as ukn uwner crnoroowner":148,"team_id":2} {"correlation_ id":"f33d.11:09:120[Prospect match] Cache miss11:04:151local.INF0: [Hubspot] Failed to fetch contact {"email":"nikolay.nikolov@jimin11:04:151local.INF0: [Prospect match] API returned empty result11:04:15|10:09:1501local.WARNING: [Hubspot] Nolocal.WARNING: [Hubspotl ReceivedExceptions\BadRequest""me'POST [URL_WITH_CREDENTIALS] local.INF0: [Prospect matchl cached empty result - no APT calls. try next matching method {"identifier type"."email" "identifier"."nikolTuondlolnbeno+Dotol&md+11: 09:141LocaL.INF0: Matchactzvityci11:09:141111: 09:141Asvncuodate.l10: 09 :14110: 09 :141LocaLINFO:SoctalAccounts11: 09• 14711: 09•147Local.TNF0lEncrvotedTokeni11: 09:141 Local. TNF0CrmOwnerResolv...
|
NULL
|
-7219240454161278196
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicareCodeFV faVsco.js°9 JY-20725-h PhostormVIewINavicareCodeFV faVsco.js°9 JY-20725-handle-HS-search-rate-Iiyroledey© BatchSyncCollectole balchsynckealssec clientone© ClosedDealStagesS © RateLimitExceDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phrC) FieldT vpeconvertee Hubspotclientinterc) Hubspot Tokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalizec) Service.onrC)SvncFieldAction.onC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM AcceccorsConfigD DTO> M SiltersJobs• M ProcnectSoarchStreW service lralts© DataClient.php© DecorateActivity.ph(e)LocalSearch.onpu Localsearchinteria© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache> M Metadata> Miarationa Pioedrivev Salesforce• D FieldsM OnnortunitvMatcheMOnnortunitvSvneStM ProsneetSearchStr.• M ServiceTraitcC) Client nhr© DecorateActivity.ph. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phplucaneTacts naccod. 12 (todav 12:02WindowC) CachedCrmServiceDecorator.ongT DeleteCrmEntityTrait.phpclass Client extends Basecllent impLements HubspotcllentintertaceSthis->executeRequest(fn • => $this->getNewInstance@->crm0->...);* atemplate T* apanam callable: T $apiCall* drexurn* ochrows kateL1m1ctxcepczonorivate function executeRequestcallable SapicaloScachekev = sthis->qetRateLim1tcacheKevo:ScachedRetrvAfter = Redis:.det Scachekev):1+ us strinoscachedRetrvAfter)vx 1s_numericScachedRetrvAfter)) <throw new RateLimitExcentiong'Hubspot rate limit (cached circuit-breaker)',Gint) ScachedRetrvAfter.tryneturn Canicalld} catch (Throwable $e) {if (Sthis->isHubspotRateLimit(Se)) {SretryAfter = $this->parseRetryAfter($e);Redis::setex($cacheKey, SretryAfter, (string) $retryAfter):Sthis->loq->warning('[Hubspot] Received 429 from API'. [ttoom idl= sth1s->cont10->team1d'config id'=> Sthis->config->qetIdO."retry after' => Sretrvafter= Sthis-›parseMessage(Se).= Se->qetMessageorthrow new RateLimitExcention( message: 'Hubspot returned 429' SretrvAfter. Se);throw Se:Hudspol/serwice.pnpProviderkateLimiter.phgA2/67 V3 APreparation tor kerl…. In oum100% 1• Mon 11 May 14:11:01&console [pRODlA console [EUiconsole [STAGINGIш 1 шuш1l I11= custom.log=laravel.log XCc W.*11: 08:4511local.INFO: Jiminny \Console\Commands\Command::run Memory usage before starting command 1"command": "mailbox:batch:retry-failed", "memoryBeforecon11: 08:451111•08•467|local.INFO: Jiminny \Console\Commands \Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_config11•09•121|local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_i11[PHONE]1 INEO. AsvnclndateSlasticSeanch Entity added to Redis Zist "entityIyne" "activities" "entityId" :615092"welueeelolnKevmeepeerelelen11•00•121local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_idSocialAccountCenvicol Cetchina token «icocialAcolocal.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"p)11:09:12] local.INF0: [EncryptedTokenManager] Generating access toker11.07.141Local. Inru.urmuwnerkesolver Incegracion owner macched as ukn uwner crnoroowner":148,"team_id":2} {"correlation_ id":"f33d.11:09:120[Prospect match] Cache miss11:04:151local.INF0: [Hubspot] Failed to fetch contact {"email":"nikolay.nikolov@jimin11:04:151local.INF0: [Prospect match] API returned empty result11:04:15|10:09:1501local.WARNING: [Hubspot] Nolocal.WARNING: [Hubspotl ReceivedExceptions\BadRequest""me'POST [URL_WITH_CREDENTIALS] local.INF0: [Prospect matchl cached empty result - no APT calls. try next matching method {"identifier type"."email" "identifier"."nikolTuondlolnbeno+Dotol&md+11: 09:141LocaL.INF0: Matchactzvityci11:09:141111: 09:141Asvncuodate.l10: 09 :14110: 09 :141LocaLINFO:SoctalAccounts11: 09• 14711: 09•147Local.TNF0lEncrvotedTokeni11: 09:141 Local. TNF0CrmOwnerResolv...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18318
|
792
|
16
|
2026-05-11T11:11:01.374832+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497861374_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 m100% <78• Mon 11 May 14:11:01181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
-4935448659785169043
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelplalnPreparation for Refi... in 50 m100% <78• Mon 11 May 14:11:01181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)883Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18320
|
792
|
17
|
2026-05-11T11:11:32.845989+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497892845_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6949267270481944867
|
6378759348859832420
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex...
|
18318
|
NULL
|
NULL
|
NULL
|
|
18321
|
793
|
15
|
2026-05-11T11:11:35.222376+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497895222_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.7430186,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.75166225,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.7603058,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.97539896,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"bounds":{"left":0.96210104,"top":0.10933759,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.10774142,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.10774142,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"bounds":{"left":0.4268617,"top":0.10614525,"width":0.5731383,"height":0.89385474},"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
18319
|
NULL
|
NULL
|
NULL
|
|
18322
|
792
|
18
|
2026-05-11T11:11:40.558482+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497900558_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 49 m100% <78• Mon 11 May 14:11:40181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
8073110775621949109
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 49 m100% <78• Mon 11 May 14:11:40181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18323
|
793
|
16
|
2026-05-11T11:11:40.578021+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497900578_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicareCodeFV faVsco.js~%9 JY-20725- PhostormVIewINavicareCodeFV faVsco.js~%9 JY-20725-handle-HS-search-rate-limroledey© BatchSyncCollectore balchsynckealssec clientone© ClosedDealStagess ® RateLimitExceDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspot Tokenman© PayloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM Accaccors)ConfigD DTO> M SiltersJobsD ProspectSearchStraW service lralts© DataClient.php© DecorateActivity.pr©LocalSearch.phpu Localsearchinteria© RemoteSearch.phpc) Service.phpv _ Listenersc) ConvertLeadActivitc) PurceLookuocache› D Metadata> 2 Miaration> = Pioedrivev Salesforce• D FieldsM OnnortunitvMatcheOpportunitySyncStrM ProsneetSearchStr.> D ServiceTraitsC) Client nhr© DecorateActivity.pt. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.php1 usageTests passed: 13 (today 13:02)Window© CachedCrmServiceDecorator.php* DeleteCrmEntity Trait.phpclass Client extends BaseClient implements HubspotClientInterfaceSthis-›executeRequest(fn () => $this->getNewInstance()->crm()->...);* @template T* Cparam callable(): T $apiCalz* drexurn* ochrows kateLim1ctxceptzonorivate function executeRequestcallable SapicaloScachekev = sthis->qetRatelim1tcachekevo:$cachedRetryAfter = Redis: :get($cacheKey);1+ us strino scachedRetrvAfter) vx 1s numericScachedRetrvAfter)) <throw new RateLimitExcention'Hubspot rate limit (cached circuit-breaker)',Gint) ScachedRetrvAfter.try{return $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {SretryAfter = $this->parseRetryAfter($e);Redis: : setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', I'team id'= sth1s->cont10->team1d'config_id'=> $this->config->getId()."retry after' => SretrvAfter= Sthis-›parseMessage(Se).= Se->qetMessageorthrow new RateLimitException( message: 'Hubspot returned 429', SretryAfter, $e);throw Se:Hudspol/serwice.pnpProviderkateLimiter.phgA2 A67 X3 ^II I1 I111111921$0halPreparation for Refi... in 49 m100% 18• Mon 11 May 14:11:40A console [PROD]A console (EU]A console [STAGING]s\Command: :run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650. "workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":63te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStantina CRM data matchina Siactivity".te single target {"target":"activities"och1 Entitv added to Pedic lict fient:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId":1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method f"1 Rate limit caught. releasing iob withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Ownen {"crbjects/contact/search' resulte...
|
NULL
|
-7906536091822420027
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicareCodeFV faVsco.js~%9 JY-20725- PhostormVIewINavicareCodeFV faVsco.js~%9 JY-20725-handle-HS-search-rate-limroledey© BatchSyncCollectore balchsynckealssec clientone© ClosedDealStagess ® RateLimitExceDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspot Tokenman© PayloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM Accaccors)ConfigD DTO> M SiltersJobsD ProspectSearchStraW service lralts© DataClient.php© DecorateActivity.pr©LocalSearch.phpu Localsearchinteria© RemoteSearch.phpc) Service.phpv _ Listenersc) ConvertLeadActivitc) PurceLookuocache› D Metadata> 2 Miaration> = Pioedrivev Salesforce• D FieldsM OnnortunitvMatcheOpportunitySyncStrM ProsneetSearchStr.> D ServiceTraitsC) Client nhr© DecorateActivity.pt. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.php1 usageTests passed: 13 (today 13:02)Window© CachedCrmServiceDecorator.php* DeleteCrmEntity Trait.phpclass Client extends BaseClient implements HubspotClientInterfaceSthis-›executeRequest(fn () => $this->getNewInstance()->crm()->...);* @template T* Cparam callable(): T $apiCalz* drexurn* ochrows kateLim1ctxceptzonorivate function executeRequestcallable SapicaloScachekev = sthis->qetRatelim1tcachekevo:$cachedRetryAfter = Redis: :get($cacheKey);1+ us strino scachedRetrvAfter) vx 1s numericScachedRetrvAfter)) <throw new RateLimitExcention'Hubspot rate limit (cached circuit-breaker)',Gint) ScachedRetrvAfter.try{return $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {SretryAfter = $this->parseRetryAfter($e);Redis: : setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', I'team id'= sth1s->cont10->team1d'config_id'=> $this->config->getId()."retry after' => SretrvAfter= Sthis-›parseMessage(Se).= Se->qetMessageorthrow new RateLimitException( message: 'Hubspot returned 429', SretryAfter, $e);throw Se:Hudspol/serwice.pnpProviderkateLimiter.phgA2 A67 X3 ^II I1 I111111921$0halPreparation for Refi... in 49 m100% 18• Mon 11 May 14:11:40A console [PROD]A console (EU]A console [STAGING]s\Command: :run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650. "workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":63te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStantina CRM data matchina Siactivity".te single target {"target":"activities"och1 Entitv added to Pedic lict fient:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId":1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method f"1 Rate limit caught. releasing iob withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Ownen {"crbjects/contact/search' resulte...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18324
|
792
|
19
|
2026-05-11T11:11:45.541769+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497905541_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5685266402682420683
|
-8926130836387591936
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 49 m100% <78• Mon 11 May 14:11:45181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
18322
|
NULL
|
NULL
|
NULL
|
|
18325
|
793
|
17
|
2026-05-11T11:11:45.562220+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497905562_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1579713784452094674
|
-8780890023316608054
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
PhostormProjectVIewINavicareCodeFV faVsco.js%9 JY-20725-handle-HS-search-rate-limi© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitExcepDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspotlokenman118© PayloadBuilder.php119C) Remotecrmobiectn120© ResponseNormalize121c) Service.onr122© SyncFieldAction.ph123C) SvncRelatedActivit124C) WebhookSvncBatcl125v MintearationAor126M Acceccors127128129class Client extends BaseClient implements HubspotClientInterfaceououc tunction 1shubspotrateuimithrowable se: 000ConfigD DTO› D Filters130Jobs> D ProspectSearchStra132133W service lralts© DataClient.php134© DecorateActivity.pr135© LocalSearch.php136© LocalSearchinterfar137© RemoteSearch.php138139c) Service.php1401v D Listeners© ConvertLeadActivit141c) PurceLookuocache142› D Metadata> Miarationi144> D Pipedrive145146v Salesforce• D Fields147M OnnortunitvMatche148OpportunitySyncSti149> M ProsnectSearchStr.150› D Service Traits151152C) Client nhr© DecorateActivity.pr153. Delete@biectsTrait154© FieldDefinitions.php155© PayloadBuilder.php156© Profile.php157© QueryBuilder.php158159if (Se instanceof BadRequestII $e instanceof DealApiExceptionSe instanceof ContactAoiExcentionI1 Se instanceof CompanyApiExceptionII $e instanceofGuzzleltto Exceotion ReauestExcentionreturn (int) $e->getCode() === 429;return false;• public function barseRetryAfter(Throwable $e): intif (method_exists($e,method: 'getResponseHeaders')){Sheaders = $e->getResponseHeaders() ?: [];$value = Sheaders ['Retry-After'] ?? Sheaders['retry-after'] ?? null;if (is_array($value)) {Svalue = Svaluelol ?? null:if cio numerdo(svaluve)) +return (int) svalue:Smessage = strtolower (Sthis-›parseMessage(Se));if (str_contains($message, 'daily'») {neturn 600.ir etn cotoin hancago, en ecoaly)return 10;if (otn.contasins (iressage, 'seconty »)return 1:$this->log->warning(' [Hubspot] No retry-after header or known message, using default', ['exception_class' => get_class($e),Imoccanol => SmessadelI):Tests passed: 13 (today 13:02)Hudspol/serwice.pnpProviderkateLimiter.phgA2 A67 X3 ^nututTH21I III$0halPreparation for Refi... in 49 m100% 18• Mon 11 May 14:11:45A console [PROD]A console (EU]A console [STAGING]s\Command: :run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":63te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId" :1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target":"activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"och1 Entitv added to Pedic lict fient:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId":1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method f"1 Rate limit caught. releasing iob withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."leoaaration owner matched as CRM Ownen {"crbjects/contact/search' resulte...
|
18323
|
NULL
|
NULL
|
NULL
|
|
18327
|
793
|
18
|
2026-05-11T11:11:49.387572+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497909387_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.7430186,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.75166225,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.7603058,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.97539896,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6538278410563453966
|
6378759348926941284
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18326
|
792
|
20
|
2026-05-11T11:11:49.402777+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497909402_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5857814237119292699
|
6378759348926941284
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18328
|
792
|
21
|
2026-05-11T11:11:52.366271+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497912366_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5023331182739006308
|
6378759348859832420
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line...
|
18326
|
NULL
|
NULL
|
NULL
|
|
18329
|
793
|
19
|
2026-05-11T11:11:52.371575+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497912371_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5519104527307231019
|
6378757149836576868
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace...
|
18327
|
NULL
|
NULL
|
NULL
|
|
18330
|
792
|
22
|
2026-05-11T11:12:04.512325+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497924512_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false}]...
|
3072593486201138013
|
6378757149903685732
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18331
|
793
|
20
|
2026-05-11T11:12:04.512968+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497924512_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6964831806923742495
|
6378757149836576868
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18333
|
793
|
21
|
2026-05-11T11:12:07.900130+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497927900_m2.jpg...
|
PhpStorm
|
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.p Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
100
100
'message' => $this->parseMessage($e),
'message' => $this->parseMessage($e),
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
143
143
$message = strtolower($this->parseMessage($e));
$message = strtolower($this->parseMessage($e));
Merge Usages from the Same Line
Show Read Access
Show Write Access
Show Results In Generated Code
Show Import Statements
Show $this/self references
Show Options
Preview Source
Project Files
Usages
Settings…
Services/Crm/Hubspot/Client.php
Method \Jiminny\Services\Crm\Hubspot\Client.parseMessage Client .../app/Services/Crm/Hubspot
2 usages
Open in Find Tool Window...
|
[{"role":"AXCell","text":& [{"role":"AXCell","text":"Crm/Hubspot/Client.php, class","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"Crm/Hubspot/Client.php, class","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"100","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"100","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"'message' => $this->parseMessage($e),","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"'message' => $this->parseMessage($e),","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"Crm/Hubspot/Client.php, class","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"Crm/Hubspot/Client.php, class","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"143","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"143","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"$message = strtolower($this->parseMessage($e));","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"$message = strtolower($this->parseMessage($e));","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Merge Usages from the Same Line","depth":2,"bounds":{"left":0.1456117,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Read Access","depth":2,"bounds":{"left":0.15425532,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Write Access","depth":2,"bounds":{"left":0.16289894,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Results In Generated Code","depth":2,"bounds":{"left":0.17154256,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Import Statements","depth":2,"bounds":{"left":0.18018617,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show $this/self references","depth":2,"bounds":{"left":0.1888298,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Options","depth":2,"bounds":{"left":0.1974734,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Preview Source","depth":2,"bounds":{"left":0.20844415,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Project Files","depth":2,"bounds":{"left":0.21708776,"top":0.47406226,"width":0.03557181,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Usages","depth":1,"bounds":{"left":0.3706782,"top":0.4764565,"width":0.015292553,"height":0.013567438},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Settings…","depth":2,"bounds":{"left":0.38863033,"top":0.47406226,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Services/Crm/Hubspot/Client.php","depth":1,"bounds":{"left":0.14727394,"top":0.5403033,"width":0.0631649,"height":0.013567438},"on_screen":true,"help_text":"Services/Crm/Hubspot/Client.php","role_description":"text"},{"role":"AXStaticText","text":"Method \\Jiminny\\Services\\Crm\\Hubspot\\Client.parseMessage Client .../app/Services/Crm/Hubspot","depth":1,"bounds":{"left":0.14727394,"top":0.4517159,"width":0.20611702,"height":0.013567438},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2 usages","depth":1,"bounds":{"left":0.36768618,"top":0.4517159,"width":0.018284574,"height":0.013567438},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Open in Find Tool Window","depth":2,"bounds":{"left":0.38863033,"top":0.44852355,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
7385985519245525894
|
-4049484209358070896
|
click
|
accessibility
|
NULL
|
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.p Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
100
100
'message' => $this->parseMessage($e),
'message' => $this->parseMessage($e),
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
143
143
$message = strtolower($this->parseMessage($e));
$message = strtolower($this->parseMessage($e));
Merge Usages from the Same Line
Show Read Access
Show Write Access
Show Results In Generated Code
Show Import Statements
Show $this/self references
Show Options
Preview Source
Project Files
Usages
Settings…
Services/Crm/Hubspot/Client.php
Method \Jiminny\Services\Crm\Hubspot\Client.parseMessage Client .../app/Services/Crm/Hubspot
2 usages
Open in Find Tool Window...
|
18331
|
NULL
|
NULL
|
NULL
|
|
18332
|
792
|
23
|
2026-05-11T11:12:07.918+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497927918_m1.jpg...
|
PhpStorm
|
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.p Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
100
100
'message' => $this->parseMessage($e),
'message' => $this->parseMessage($e),
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
143
143
$message = strtolower($this->parseMessage($e));
$message = strtolower($this->parseMessage($e));
Merge Usages from the Same Line
Show Read Access
Show Write Access
Show Results In Generated Code
Show Import Statements
Show $this/self references
Show Options
Preview Source
Project Files
Usages
Settings…
Services/Crm/Hubspot/Client.php
Method \Jiminny\Services\Crm\Hubspot\Client.parseMessage Client .../app/Services/Crm/Hubspot
2 usages...
|
[{"role":"AXCell","text":& [{"role":"AXCell","text":"Crm/Hubspot/Client.php, class","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"Crm/Hubspot/Client.php, class","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"100","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"100","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"'message' => $this->parseMessage($e),","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"'message' => $this->parseMessage($e),","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"Crm/Hubspot/Client.php, class","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"Crm/Hubspot/Client.php, class","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"143","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"143","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXCell","text":"$message = strtolower($this->parseMessage($e));","depth":4,"on_screen":false,"role_description":"cell"},{"role":"AXStaticText","text":"$message = strtolower($this->parseMessage($e));","depth":5,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Merge Usages from the Same Line","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Read Access","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Write Access","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Results In Generated Code","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Import Statements","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show $this/self references","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Options","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Preview Source","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Project Files","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Usages","depth":1,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Settings…","depth":2,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Services/Crm/Hubspot/Client.php","depth":1,"on_screen":true,"help_text":"Services/Crm/Hubspot/Client.php","role_description":"text"},{"role":"AXStaticText","text":"Method \\Jiminny\\Services\\Crm\\Hubspot\\Client.parseMessage Client .../app/Services/Crm/Hubspot","depth":1,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2 usages","depth":1,"on_screen":true,"role_description":"text"}]...
|
-7202325251088083724
|
-3040678442585515120
|
click
|
accessibility
|
NULL
|
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.p Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
100
100
'message' => $this->parseMessage($e),
'message' => $this->parseMessage($e),
Crm/Hubspot/Client.php, class
Crm/Hubspot/Client.php, class
143
143
$message = strtolower($this->parseMessage($e));
$message = strtolower($this->parseMessage($e));
Merge Usages from the Same Line
Show Read Access
Show Write Access
Show Results In Generated Code
Show Import Statements
Show $this/self references
Show Options
Preview Source
Project Files
Usages
Settings…
Services/Crm/Hubspot/Client.php
Method \Jiminny\Services\Crm\Hubspot\Client.parseMessage Client .../app/Services/Crm/Hubspot
2 usages...
|
18330
|
NULL
|
NULL
|
NULL
|
|
18334
|
792
|
24
|
2026-05-11T11:12:09.428758+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497929428_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18335
|
793
|
22
|
2026-05-11T11:12:09.428952+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497929428_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.5575133,"top":0.08060654,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.57014626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"bounds":{"left":0.58111703,"top":0.07980846,"width":0.077792555,"height":0.015961692},"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.66788566,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.67785907,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.68650264,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.69514626,"top":0.07980846,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/4","depth":4,"bounds":{"left":0.7087766,"top":0.079010375,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.734375,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.7430186,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.75166225,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.7603058,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.97539896,"top":0.07821229,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"35","depth":4,"bounds":{"left":0.96210104,"top":0.10933759,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.9740692,"top":0.10774142,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.98138297,"top":0.10774142,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","depth":4,"bounds":{"left":0.4268617,"top":0.10614525,"width":0.5731383,"height":0.89385474},"on_screen":true,"value":"[2026-05-11 11:08:45] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {\"pid\":72650,\"workerId\":\"\",\"target\":\"activities\"} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:08:46] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"mailbox:batch:retry-failed\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"43b1fb67-9aac-4fc6-9ced-689ecda5c548\",\"trace_id\":\"60028d0e-dcd8-496a-a7ba-3a04b8d646e2\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":615092,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":615092} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":615092,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":615092,\"participants\":[{\"id\":1004102,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1004103,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"nikolay.nikolov@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-1 (truncated...)\n\"} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f33d47cb-76c6-4c27-a641-48cbf69e623d\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614436,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614436} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614436,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614436,\"participants\":[{\"id\":1002751,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002752,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"ccafe863-7885-4971-96fb-87ef6dd4adf3\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614382,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614382} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614382,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614382,\"participants\":[{\"id\":1002632,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002633,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"f00a4506-adfe-4fdc-b932-e6d2bc751fde\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614381,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614381} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614381,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614381,\"participants\":[{\"id\":1002630,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002631,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"36bd73f5-17f9-4f70-8254-2214543c7f8e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":614378,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":6167,\"account_id\":null,\"opportunity_id\":null,\"stage_id\":null}} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":614378} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":614378,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":614378,\"participants\":[{\"id\":1002623,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1002624,\"user_id\":null,\"contact_id\":6167,\"lead_id\":null},{\"id\":1002625,\"user_id\":89,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"nikolay.nikolov@jiminny.com\"} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"a4a3a058-ec22-4f04-bb14-a9bff18ce214\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613840,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613840,\"participants\":[{\"id\":1001764,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001765,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":261} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":299} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613840,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613840,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613840} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613840,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613840,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"b99b7220-24ab-4f53-a05f-887c3c5341bc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613833,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613833,\"participants\":[{\"id\":1001750,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001751,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ScheduleBotCommand] Number of activities to be captured: 0 {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"meeting-bot:schedule-bot\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"d86caa21-8980-460b-b2be-88292956cdb3\",\"trace_id\":\"6f80ed90-fa59-444e-a016-33a62019c6a4\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613833,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613833,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613833} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613833,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613833,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ed230e3b-8ded-4591-bfe7-d4ead6f411c1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613827,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613827,\"participants\":[{\"id\":1001734,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001735,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613827,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613827,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613827} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613827,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613827,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d165f8f2-23f6-4f9a-90e7-7b600066818c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613826,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613826,\"participants\":[{\"id\":1001732,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001733,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613826,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613826,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613826} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613826,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613826,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1816f96e-c36b-474a-8f46-bc8c71bb0079\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613820,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613820,\"participants\":[{\"id\":1001721,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001722,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613820,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613820,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613820} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613820,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613820,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"a2b1cf94-6665-4574-a821-fcd845d290dc\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613818,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613818,\"participants\":[{\"id\":1001717,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001718,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613818,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613818,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613818} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613818,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613818,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"7194ba37-7af3-4aa0-80a3-14b38431fd39\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613812,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:16] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613812,\"participants\":[{\"id\":1001705,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001706,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613812,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613812,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613812} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613812,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613812,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"1fe899e0-6ad7-4159-b5f9-6f34b32d31d6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613807,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613807,\"participants\":[{\"id\":1001690,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001691,\"user_id\":null,\"contact_id\":4484,\"lead_id\":null}]} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613807,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4484,\"owner_id\":253} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4484} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4484,\"opportunity_id\":276} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":1.06,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"tsvetomir.banovski@gmail.com\"} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613807,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613807} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613807,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613807,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4484,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"3056d45f-0cd9-4a93-a3df-e55dc6891629\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613806,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613806,\"participants\":[{\"id\":1001688,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001689,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613806,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":253} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613806,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613806} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613806,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613806,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"f5ad2183-f63f-4901-8bf0-bc6fc374aaae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613805,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613805,\"participants\":[{\"id\":1001686,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1001687,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613805,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:17] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613805,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613805} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613805,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613805,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"e6a724a6-dc6e-4440-ab48-641336d6ca17\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613698,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613698,\"participants\":[{\"id\":1001667,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001668,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613698,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613698,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613698} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613698,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613698,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"67158d25-23dc-4314-8813-caa3c43fa3f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613697,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613697,\"participants\":[{\"id\":1001665,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001666,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613697,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613697,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613697} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613697,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:18] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613697,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d2a290e-88e6-494a-91c2-f63f0338f30f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613696,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613696,\"participants\":[{\"id\":1001663,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001664,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613696,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613696,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613696} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613696,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613696,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d1c50e93-0488-4315-a739-f89181b77d87\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613695,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613695,\"participants\":[{\"id\":1001661,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001662,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613695,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613695,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613695} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613695,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613695,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"6dbd1e2c-b89e-47b6-9c2f-d9d7a56b5383\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613694,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613694,\"participants\":[{\"id\":1001659,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1001660,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613694,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613694,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613694} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613694,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:19] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613694,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"cd14d297-e2e1-425f-b745-361ca50df005\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613157,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613157,\"participants\":[{\"id\":1000746,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000747,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613157,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613157,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613157} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613157,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613157,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"ed6d3fa0-08c4-412f-b60d-4582c6dfa704\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613156,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613156,\"participants\":[{\"id\":1000744,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000745,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613156,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613156,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613156} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613156,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613156,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"77af6469-661f-4d4b-b741-a5b059c8b181\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613155,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613155,\"participants\":[{\"id\":1000742,\"user_id\":253,\"contact_id\":null,\"lead_id\":null},{\"id\":1000743,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613155,\"team_id\":2,\"email\":\"preslava.ivanova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613155,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613155} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613155,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613155,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"6cd64b7d-2826-41b3-83e4-000c5cd88462\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":613130,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":613130,\"participants\":[{\"id\":1000693,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000694,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":613130,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":613130,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:20] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":613130} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":613130,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":613130,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"8d0dfbe8-30bd-4332-bf52-762b3a44300b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612924,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612924,\"participants\":[{\"id\":1000290,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000291,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612924,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":19} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":165} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612924,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612924} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612924,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:21] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612924,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"589c0894-ea02-4860-a29d-b4c01aebed50\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612923,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612923,\"participants\":[{\"id\":1000288,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000289,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612923,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:23] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612923,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612923} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612923,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612923,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"773e5722-a5c7-48ec-b0d8-11b3aa2aa37a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612922,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89}} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612922,\"participants\":[{\"id\":1000286,\"user_id\":19,\"contact_id\":null,\"lead_id\":null},{\"id\":1000287,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:24] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612922,\"team_id\":2,\"email\":\"james.graham@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612922,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612922} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612922,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612922,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":165,\"stage_id\":89} {\"correlation_id\":\"7d6f9c8c-16e0-4f84-b07d-adddfa5c739f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612847,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612847} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612847,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612847,\"participants\":[{\"id\":1000130,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":1000131,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000151,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:25] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage before starting command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryPeakBeforeCommandInMb\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: Jiminny\\Console\\Commands\\Command::run Memory usage for command {\"command\":\"dialers:monitor-activities\",\"memoryBeforeCommandInMb\":60.0,\"memoryAfterCommandInMB\":60.0,\"memoryPeakBeforeCommandInMb\":99.727,\"memoryPeakAfterCommandInMB\":99.727} {\"correlation_id\":\"503de928-3a1a-4314-a23f-ca2625111f7f\",\"trace_id\":\"7ee54e65-014c-4ae3-821a-dc0488dc10ed\"}\n[2026-05-11 11:09:26] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"adelina.petrova@jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/adelina.petrova%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] No retry-after header or known message, using default {\"exception_class\":\"SevenShores\\\\Hubspot\\\\Exceptions\\\\BadRequest\",\"message\":\"\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.WARNING: [Hubspot] Received 429 from API {\"team_id\":2,\"config_id\":2,\"retry_after\":10,\"message\":\"\",\"reason\":\"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:\n{\\\"status\\\":\\\"error\\\",\\\"message\\\":\\\"You have reached your secondly limit.\\\",\\\"errorType\\\":\\\"RATE_LIMIT\\\",\\\"correlationId\\\":\\\"019e16ba-4 (truncated...)\n\"} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"462c34b9-0b57-4e81-a9e2-5ce4a6900814\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612822,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:26] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612822,\"participants\":[{\"id\":1000080,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000081,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612822,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612822,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612822} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612822,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612822,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"ca259dfb-7b24-4406-9b61-a4f28761020b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612819,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612819} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612819,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612819,\"participants\":[{\"id\":1000073,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":1000074,\"user_id\":261,\"contact_id\":null,\"lead_id\":null},{\"id\":1000075,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612819,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"adelina.petrova@jiminny.com\"} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cd602b18-88a5-4ea9-afef-e52be017fc0f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612673,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612673,\"participants\":[{\"id\":999993,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999994,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612673,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612673,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612673} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612673,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612673,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"d86174e3-e3b0-41d6-b9f5-97de4ca4da9f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612642,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36}} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612642,\"participants\":[{\"id\":999935,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null},{\"id\":999936,\"user_id\":261,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612642,\"team_id\":2,\"email\":\"adelina.petrova@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612642,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612642} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612642,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:27] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612642,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":299,\"stage_id\":36} {\"correlation_id\":\"2f9f8923-a6e3-4e5b-a1ae-cdea42bb3cda\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612598,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612598,\"participants\":[{\"id\":999857,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999858,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":243,\"contact_id\":4491,\"owner_id\":206} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":243,\"contact_id\":4491} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":243,\"contact_id\":4491,\"opportunity_id\":276} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612598,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612598,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612598} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612598,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612598,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"65bf29b2-12dc-4d67-a47e-52e71166d9f6\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":5.94,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612597,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612597,\"participants\":[{\"id\":999855,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999856,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612597,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612597,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612597} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612597,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612597,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"c69a3a24-bab5-4d56-887b-01111944b3a2\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612596,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612596,\"participants\":[{\"id\":999853,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999854,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:28] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612596,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612596,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612596} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612596,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612596,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0da9fc28-653b-406f-bafe-5d78010cb3da\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612595,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612595,\"participants\":[{\"id\":999851,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999852,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612595,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612595,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612595} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612595,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612595,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"f7dd9c18-1f48-4adc-b2a2-a5e768444dfd\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612594,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612594,\"participants\":[{\"id\":999849,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999850,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612594,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612594,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612594} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612594,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612594,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4dacaa76-fc8b-462e-95ae-b74602d62a8f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612593,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612593,\"participants\":[{\"id\":999847,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999848,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612593,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612593,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612593} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612593,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612593,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"0845a766-3bc8-4303-83dc-9f0e57d46a44\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612592,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612592,\"participants\":[{\"id\":999845,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999846,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612592,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612592,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612592} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612592,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:29] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612592,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"315733d6-e316-4fb7-9ab6-c38b0bc2a394\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612591,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612591,\"participants\":[{\"id\":999843,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999844,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612591,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612591,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612591} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612591,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612591,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a4f3cee6-628d-4ea1-afef-271709541a6f\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612590,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612590,\"participants\":[{\"id\":999841,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999842,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612590,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612590,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612590} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612590,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612590,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"dfa94946-5871-4106-8e8f-5e7a418e64ae\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612589,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612589,\"participants\":[{\"id\":999839,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999840,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612589,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612589,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612589} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612589,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612589,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"92666ef7-2d6e-4056-9d87-23df1bc694b1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612588,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612588,\"participants\":[{\"id\":999837,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999838,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612588,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612588,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612588} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612588,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:30] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612588,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"7441c20c-f1d3-4310-a3a7-2c1aad9bbe25\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612587,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612587,\"participants\":[{\"id\":999835,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999836,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612587,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612587,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612587} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612587,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612587,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b6283377-e461-4841-90a6-bd9b51c31e78\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612586,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612586,\"participants\":[{\"id\":999833,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999834,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612586,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612586,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612586} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612586,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612586,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"d0ddb01c-2b21-4989-998a-fa52e7affced\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring start {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612585,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.NOTICE: Monitoring end {\"correlation_id\":\"772cf24f-66f8-49c0-8ef5-e6c1d128fccb\",\"trace_id\":\"2d950f5a-3a35-4a8b-b33b-4d129409925b\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612585,\"participants\":[{\"id\":999831,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999832,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612585,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612585,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612585} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612585,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612585,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"cef11ffe-61af-425d-b899-399323237a47\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612584,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612584,\"participants\":[{\"id\":999829,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999830,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612584,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612584,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612584} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612584,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612584,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"2aa83935-5a46-4a3d-98d7-acfcf3f3f6cb\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612583,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612583,\"participants\":[{\"id\":999827,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999828,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612583,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612583,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612583} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612583,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:31] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612583,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"04dd4d55-bdb2-4f42-9fbd-8a132707b475\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612582,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612582,\"participants\":[{\"id\":999825,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999826,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612582,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612582,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612582} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612582,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612582,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"58e7116b-76f4-4698-a629-ff1eb613d93e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612581,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612581,\"participants\":[{\"id\":999823,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999824,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612581,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612581,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612581} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612581,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612581,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"b1cdf1eb-a77f-4062-bc7a-52e75ec005f1\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612565,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612565,\"participants\":[{\"id\":999789,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999790,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null}]} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612565,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:32] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612565,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612565} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612565,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612565,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"4531fd00-7875-4334-b3c2-407d31ec1255\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612563,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34}} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612563,\"participants\":[{\"id\":999784,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999785,\"user_id\":null,\"contact_id\":4487,\"lead_id\":null}]} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612563,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":244,\"contact_id\":4487,\"owner_id\":206} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":244,\"contact_id\":4487} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":244,\"contact_id\":4487,\"opportunity_id\":350} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinson@crusoe.com\"} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612563,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612563} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612563,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612563,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4487,\"account_id\":244,\"opportunity_id\":350,\"stage_id\":34} {\"correlation_id\":\"b2ea69fc-9176-494f-b933-f64c1de72377\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612562,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612562} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612562,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612562,\"participants\":[{\"id\":999782,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999783,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:33] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447782589921@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447782589921%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":14} {\"correlation_id\":\"096bc408-0a3f-43ef-9cf6-f9007ee7315c\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612561,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612561} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612561,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612561,\"participants\":[{\"id\":999780,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999781,\"user_id\":null,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612561,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:34] local.INFO: [Prospect match] Cache miss, calling the API {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Hubspot] Failed to fetch contact {\"email\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\",\"reason\":\"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/447700174614.447782589921.OeREojLVnk%40txt.staging.jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {\"identifier_type\":\"email\",\"identifier\":\"447700174614.447782589921.OeREojLVnk@txt.staging.jiminny.com\"} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":10} {\"correlation_id\":\"cded6bdb-0e7c-4baa-b280-5798e81b236a\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612560,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":null,\"account_id\":26,\"opportunity_id\":22,\"stage_id\":89}} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612560} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612560,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612560,\"participants\":[{\"id\":999778,\"user_id\":null,\"contact_id\":null,\"lead_id\":null},{\"id\":999779,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {\"identifier_type\":\"email\",\"identifier\":\"447782589921@txt.staging.jiminny.com\"} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {\"job_class\":\"Jiminny\\\\Jobs\\\\Crm\\\\MatchActivityCrmData\",\"attempts\":1,\"retry_after\":10,\"delay\":12} {\"correlation_id\":\"53ef5599-df42-4f3d-90a1-8f89c19435e4\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612559,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612559,\"participants\":[{\"id\":999776,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999777,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612559,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Searching DB for opportunity by owner {\"account_id\":69,\"contact_id\":97,\"owner_id\":206} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Fallback DB opportunity search {\"account_id\":69,\"contact_id\":97} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: ProspectCache - Opportunity DB search results {\"account_id\":69,\"contact_id\":97,\"opportunity_id\":5011} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateProcessManager ] Finished updating entities in ES {\"worker\":\"\",\"peak_memory\":\"99.73 MB\",\"elapsed_seconds\":2.07,\"update_target\":\"activities\",\"should_iterate_again\":false} {\"correlation_id\":\"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8\",\"trace_id\":\"906573b5-005c-4820-8a32-3b0703ea86dd\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612559,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612559} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612559,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612559,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c3d3b2ae-6863-4f04-94a5-f09eabb50d2e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612558,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612558,\"participants\":[{\"id\":999774,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999775,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612558,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612558,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612558} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612558,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612558,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"34a7b1c6-be3b-4790-a04c-0311e25dadc8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:35] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612557,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612557,\"participants\":[{\"id\":999772,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999773,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612557,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612557,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612557} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612557,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612557,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"26d4d3d0-ebf8-44ad-a48f-24728e5539e0\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612556,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612556,\"participants\":[{\"id\":999770,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999771,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612556,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612556,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612556} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612556,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612556,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"406b7ad3-26d6-4b1b-9ad7-fff68622b149\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612555,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612555,\"participants\":[{\"id\":999768,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999769,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612555,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612555,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612555} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612555,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612555,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c15b7703-f17b-48e7-bf38-122448d79345\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612554,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612554,\"participants\":[{\"id\":999766,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999767,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612554,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612554,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612554} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612554,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612554,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c9cce71b-d96d-4117-b9fb-bb9672ae7c2b\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612553,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612553,\"participants\":[{\"id\":999764,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999765,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612553,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612553,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612553} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612553,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612553,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"ffd2857e-be14-4ab1-8533-93b20116db02\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612552,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612552,\"participants\":[{\"id\":999762,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999763,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612552,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612552,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612552} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612552,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612552,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"7942c5ee-3b2d-4f76-8728-d5343cd7b02e\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612551,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612551,\"participants\":[{\"id\":999760,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999761,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612551,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612551,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612551} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612551,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:36] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612551,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"8068bb0d-ab6d-48ee-abe2-d6cd116aba26\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612550,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612550,\"participants\":[{\"id\":999758,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999759,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612550,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:37] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612550,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612550} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612550,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612550,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"36bdbff9-cfb6-43af-b7c4-f2caafa8e794\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612549,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34}} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:38] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612549,\"participants\":[{\"id\":999756,\"user_id\":206,\"contact_id\":null,\"lead_id\":null},{\"id\":999757,\"user_id\":null,\"contact_id\":97,\"lead_id\":null}]} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612549,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"robinsoncrusoe@test.com\"} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612549,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612549} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612549,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:39] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612549,\"remote_search\":true,\"lead_id\":null,\"contact_id\":97,\"account_id\":69,\"opportunity_id\":5011,\"stage_id\":34} {\"correlation_id\":\"c2ff3c6c-7380-4c1c-a1f5-50044a473ac8\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Starting CRM data matching {\"activity\":612365,\"remote_search\":true,\"set_configuration\":2,\"old_state\":{\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36}} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [MatchActivityCrmData] Participants old state {\"activity\":612365,\"participants\":[{\"id\":999563,\"user_id\":null,\"contact_id\":4491,\"lead_id\":null},{\"id\":999564,\"user_id\":206,\"contact_id\":null,\"lead_id\":null}]} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Fetching token {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [SocialAccountService] Token retrieved {\"socialAccountId\":1499,\"provider\":\"hubspot\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [EncryptedTokenManager] Generating access token. {\"mode\":\"legacy\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {\"crm_provider\":\"hubspot\",\"crm_owner\":148,\"team_id\":2} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [Prospect match] Cache / local search hit {\"identifier_type\":\"email\",\"identifier\":\"horencho@gmail.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] Email domain belongs to the team, skipping crm lookup {\"activity_id\":612365,\"team_id\":2,\"email\":\"horen.kirazyan@jiminny.onmicrosoft.com\"} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [CrmActivityService] CRM matching completed {\"activity_id\":612365,\"participants_processed\":2,\"exact_matches\":1,\"domain_matches\":0,\"best_match_found\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ EsUpdateTarget ] Update single target {\"target\":\"activities\",\"purpose\":\"searchable-observer-update\",\"entityId\":612365} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:40] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {\"entityType\":\"activities\",\"entityId\":612365,\"collectionKey\":\"activities-for-update-priority\",\"withPriority\":true} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}\n[2026-05-11 11:09:41] local.INFO: [MatchActivityCrmData] Successfully matched CRM data {\"activity\":612365,\"remote_search\":true,\"lead_id\":null,\"contact_id\":4491,\"account_id\":243,\"opportunity_id\":276,\"stage_id\":36} {\"correlation_id\":\"a9faea34-163e-4d2a-8007-c903951e3b79\",\"trace_id\":\"7954a095-b2fb-4c22-bbb6-0c5baa0c7176\"}","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6484356494691795887
|
-2556523045428524700
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/4
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
35
Previous Highlighted Error
Next Highlighted Error
[2026-05-11 11:08:45] local.INFO: Jiminny\Console\Commands\Command::run Memory usage before starting command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryPeakBeforeCommandInMb":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:08:45] local.INFO: [Commands/AsyncUpdateEsEntities] Starting ES update worker {"pid":72650,"workerId":"","target":"activities"} {"correlation_id":"6d49ffdc-2ed7-4eae-a1ee-e25ca95bbea8","trace_id":"906573b5-005c-4820-8a32-3b0703ea86dd"}
[2026-05-11 11:08:46] local.INFO: Jiminny\Console\Commands\Command::run Memory usage for command {"command":"mailbox:batch:retry-failed","memoryBeforeCommandInMb":60.0,"memoryAfterCommandInMB":60.0,"memoryPeakBeforeCommandInMb":99.727,"memoryPeakAfterCommandInMB":99.727} {"correlation_id":"43b1fb67-9aac-4fc6-9ced-689ecda5c548","trace_id":"60028d0e-dcd8-496a-a7ba-3a04b8d646e2"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":615092,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":615092} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":615092,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [MatchActivityCrmData] Participants old state {"activity":615092,"participants":[{"id":1004102,"user_id":null,"contact_id":null,"lead_id":null},{"id":1004103,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:12] local.INFO: [Prospect match] Cache miss, calling the API {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Hubspot] Failed to fetch contact {"email":"[EMAIL]","reason":"[404] Client error: `GET https://api.hubapi.com/crm/v3/objects/contacts/nikolay.nikolov%40jiminny.com?properties=email%2Cfirstname%2Clastname%2Ccountry%2Cphone%2Cmobilephone%2Cjobtitle%2Chubspot_owner_id%2Cassociatedcompanyid%2Cphoto&archived=0&idProperty=email` resulted in a `404 Not Found` response"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [Prospect match] API returned empty result, caching the miss with empty prospect data {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] No retry-after header or known message, using default {"exception_class":"SevenShores\\Hubspot\\Exceptions\\BadRequest","message":""} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.WARNING: [Hubspot] Received 429 from API {"team_id":2,"config_id":2,"retry_after":10,"message":"","reason":"Client error: `POST https://api.hubapi.com/crm/v3/objects/contact/search` resulted in a `429 Too Many Requests` response:
{\"status\":\"error\",\"message\":\"You have reached your secondly limit.\",\"errorType\":\"RATE_LIMIT\",\"correlationId\":\"019e16ba-1 (truncated...)
"} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:13] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f33d47cb-76c6-4c27-a641-48cbf69e623d","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614436,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614436} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614436,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614436,"participants":[{"id":1002751,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002752,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"ccafe863-7885-4971-96fb-87ef6dd4adf3","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614382,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614382} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614382,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614382,"participants":[{"id":1002632,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002633,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":12} {"correlation_id":"f00a4506-adfe-4fdc-b932-e6d2bc751fde","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614381,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":null,"account_id":26,"opportunity_id":22,"stage_id":89}} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614381} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [ AsyncUpdateElasticSearch ] Entity added to Redis list {"entityType":"activities","entityId":614381,"collectionKey":"activities-for-update-priority","withPriority":true} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [MatchActivityCrmData] Participants old state {"activity":614381,"participants":[{"id":1002630,"user_id":null,"contact_id":null,"lead_id":null},{"id":1002631,"user_id":89,"contact_id":null,"lead_id":null}]} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Fetching token {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [SocialAccountService] Token retrieved {"socialAccountId":1499,"provider":"hubspot"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [EncryptedTokenManager] Generating access token. {"mode":"legacy"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [CrmOwnerResolver] Integration owner matched as CRM Owner {"crm_provider":"hubspot","crm_owner":148,"team_id":2} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] Cache / local search hit {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [Prospect match] cached empty result - no API calls, try next matching method {"identifier_type":"email","identifier":"[EMAIL]"} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:14] local.INFO: [HandleHubspotRateLimit] Rate limit caught, releasing job with delay {"job_class":"Jiminny\\Jobs\\Crm\\MatchActivityCrmData","attempts":1,"retry_after":10,"delay":10} {"correlation_id":"36bd73f5-17f9-4f70-8254-2214543c7f8e","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [MatchActivityCrmData] Starting CRM data matching {"activity":614378,"remote_search":true,"set_configuration":2,"old_state":{"lead_id":null,"contact_id":6167,"account_id":null,"opportunity_id":null,"stage_id":null}} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-4c22-bbb6-0c5baa0c7176"}
[2026-05-11 11:09:15] local.INFO: [ EsUpdateTarget ] Update single target {"target":"activities","purpose":"searchable-observer-update","entityId":614378} {"correlation_id":"a4a3a058-ec22-4f04-bb14-a9bff18ce214","trace_id":"7954a095-b2fb-...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18336
|
792
|
25
|
2026-05-11T11:12:11.075230+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497931075_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"429","depth":4,"on_screen":true,"value":"429","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5023331182739006308
|
6378759348859832420
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}
Show Replace Field
Search History
429
New Line...
|
18334
|
NULL
|
NULL
|
NULL
|
|
18337
|
793
|
23
|
2026-05-11T11:12:11.096681+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497931096_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.53889626,"top":0.17318435,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.5462101,"top":0.17318435,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\nnamespace Jiminny\\Services\\Crm\\Hubspot;\n\nuse HubSpot\\Client\\Crm\\Deals\\ApiException as DealApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\ApiException as ContactApiException;\nuse HubSpot\\Client\\Crm\\Companies\\ApiException as CompanyApiException;\nuse HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectWithAssociations as ContactsWithAssociations;\nuse HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectWithAssociations as CompaniesWithAssociations;\nuse HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectWithAssociations as DealWithAssociations;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectInput;\nuse HubSpot\\Client\\Crm\\Objects\\Model\\SimplePublicObjectWithAssociations as ObjectWithAssociations;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\Error;\nuse HubSpot\\Client\\Crm\\Pipelines\\Model\\PipelineStage;\nuse HubSpot\\Client\\Crm\\Properties\\Model\\Property;\nuse HubSpot\\Discovery\\Discovery;\nuse Jiminny\\Exceptions\\CrmException;\nuse Jiminny\\Exceptions\\RateLimitException;\nuse Jiminny\\Exceptions\\SocialAccountTokenInvalidException;\nuse Jiminny\\Jobs\\Crm\\NoteObject;\nuse Jiminny\\Models\\Crm\\Field;\nuse Jiminny\\Services\\Crm\\BaseClient;\nuse Jiminny\\Services\\Crm\\Hubspot\\DTO\\Response\\Owner;\nuse Jiminny\\Services\\SocialAccountService;\nuse SevenShores\\Hubspot\\Exceptions\\BadRequest;\nuse SevenShores\\Hubspot\\Exceptions\\HubspotException;\nuse SevenShores\\Hubspot\\Factory;\nuse SevenShores\\Hubspot\\Http\\Response;\nuse Jiminny\\Services\\Crm\\Hubspot\\Pagination\\HubspotPaginationService;\nuse Illuminate\\Support\\Facades\\Redis;\nuse Throwable;\n\n/**\n * @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}\n */\nclass Client extends BaseClient implements HubspotClientInterface\n{\n public const string MIN_API_VERSION = '2';\n\n public const string BASE_URL = 'https://api.hubapi.com';\n\n public const int ASSOCIATIONS_BATCH_SIZE_LIMIT = 1000;\n\n private HubspotPaginationService $paginationService;\n private HubspotTokenManager $tokenManager;\n\n public function __construct(\n SocialAccountService $socialAccountService,\n HubspotPaginationService $paginationService,\n HubspotTokenManager $tokenManager\n ) {\n parent::__construct($socialAccountService);\n $this->paginationService = $paginationService;\n $this->tokenManager = $tokenManager;\n\n $this->setBaseUrl(self::BASE_URL);\n $this->setVersion(self::MIN_API_VERSION);\n }\n\n /**\n * Reacts to a rate limits (429) from HubSpot by translating it\n * into a RateLimitException carrying retry_after.\n *\n * Wrap any outbound HubSpot call (SDK or raw HTTP) like:\n *\n * $this->executeRequest(fn () => $this->getNewInstance()->crm()->...);\n *\n * @template T\n * @param callable(): T $apiCall\n * @return T\n *\n * @throws RateLimitException\n */\n private function executeRequest(callable $apiCall)\n {\n $cacheKey = $this->getRateLimitCacheKey();\n\n $cachedRetryAfter = Redis::get($cacheKey);\n if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {\n throw new RateLimitException(\n 'Hubspot rate limit (cached circuit-breaker)',\n (int) $cachedRetryAfter,\n );\n }\n\n try {\n return $apiCall();\n } catch (Throwable $e) {\n if ($this->isHubspotRateLimit($e)) {\n $retryAfter = $this->parseRetryAfter($e);\n\n Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);\n\n $this->log->warning('[Hubspot] Received 429 from API', [\n 'team_id' => $this->config->team_id,\n 'config_id' => $this->config->getId(),\n 'retry_after' => $retryAfter,\n 'message' => $this->parseMessage($e),\n 'reason' => $e->getMessage(),\n ]);\n\n throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);\n }\n\n throw $e;\n }\n }\n\n private function getRateLimitCacheKey(): string\n {\n return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());\n }\n\n public function isHubspotRateLimit(Throwable $e): bool\n {\n if ($e instanceof BadRequest\n || $e instanceof DealApiException\n || $e instanceof ContactApiException\n || $e instanceof CompanyApiException\n || $e instanceof \\GuzzleHttp\\Exception\\RequestException\n ) {\n return (int) $e->getCode() === 429;\n }\n\n return false;\n }\n\n public function parseRetryAfter(Throwable $e): int\n {\n if (method_exists($e, 'getResponseHeaders')) {\n $headers = $e->getResponseHeaders() ?: [];\n $value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;\n if (is_array($value)) {\n $value = $value[0] ?? null;\n }\n if (is_numeric($value)) {\n return (int) $value;\n }\n }\n\n $message = strtolower($this->parseMessage($e));\n\n if (str_contains($message, 'daily')) {\n return 600;\n }\n if (str_contains($message, 'ten secondly')) {\n return 10;\n }\n if (str_contains($message, 'secondly')) {\n return 1;\n }\n\n $this->log->warning('[Hubspot] No retry-after header or known message, using default', [\n 'exception_class' => get_class($e),\n 'message' => $message,\n ]);\n\n return 10;\n }\n\n public function parseMessage(Throwable $e): string\n {\n if (! method_exists($e, 'getResponseBody')) {\n return '';\n }\n\n $body = $e->getResponseBody();\n if (is_string($body)) {\n $body = json_decode($body, true) ?? [];\n }\n\n if (! is_array($body)) {\n return '';\n }\n\n return (string) ($body['message'] ?? '');\n }\n\n public function getMinimumApiVersion(): string\n {\n return self::MIN_API_VERSION;\n }\n\n public function getInstance(): Factory\n {\n return new Factory([\n 'key' => $this->accessToken,\n 'oauth2' => true,\n 'base_url' => $this->baseUrl,\n ]);\n }\n\n public function getNewInstance(): Discovery\n {\n return \\HubSpot\\Factory::createWithAccessToken($this->accessToken);\n }\n\n /**\n * Secondly and daily limits for Hubspot API\n *\n * Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)\n * Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds\n * Daily: 250,000 | 500,000 | 1,000,000\n *\n * Official documentation states: The search endpoints are rate limited to five requests per second.\n * Since with 5 RPS were still hitting secondly rate limits we lowered it to 4\n */\n public function getPaginatedData(array $payload, string $type, int $offset = 0): array\n {\n $total = 0;\n $lastId = null;\n $rows = [];\n foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {\n $rows[] = $row;\n }\n\n return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];\n }\n\n /**\n * @throws HubspotException\n * @throws SocialAccountTokenInvalidException\n * @throws BadRequest\n */\n public function getPaginatedDataGenerator(\n array $payload,\n string $type,\n int $offset = 0,\n int &$total = 0,\n ?string &$lastRecordId = null\n ): \\Generator {\n return $this->paginationService->getPaginatedDataGenerator(\n $this,\n $payload,\n $type,\n $offset,\n $total,\n $lastRecordId\n );\n }\n\n /**\n * Execute a search request against HubSpot CRM objects with rate limiting.\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')\n * @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.\n * @return array The search response with 'results', 'total', 'paging' keys\n * @throws RateLimitException When rate limit is hit\n * @throws HubspotException On API errors\n */\n public function search(string $objectType, array $payload): array\n {\n $endpoint = self::BASE_URL . \"/crm/v3/objects/{$objectType}/search\";\n\n return $this->executeRequest(function () use ($endpoint, $payload) {\n $response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);\n\n return $response->toArray();\n });\n }\n\n /**\n * @throws DealApiException\n * @throws CrmException\n */\n public function getOpportunityById(string $crmId, array $fields): array\n {\n try {\n $deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n 'companies,contacts'\n );\n } catch (DealApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $deal instanceof DealWithAssociations) {\n throw new CrmException('Deal not found');\n }\n\n return [\n 'id' => $deal->getId(),\n 'properties' => $deal->getProperties(),\n 'associations' => $deal->getAssociations(),\n ];\n }\n\n /**\n * Generic batch read method for HubSpot objects\n *\n * @param string $objectType The object type ('deals', 'companies', 'contacts')\n * @param array<string> $crmIds Array of HubSpot object IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with object data\n */\n private function batchReadObjects(string $objectType, array $crmIds, array $fields): array\n {\n if (empty($crmIds)) {\n return [];\n }\n\n $this->validateBatchSize($objectType, $crmIds);\n $this->ensureValidToken();\n\n try {\n $batchConfig = $this->createBatchConfiguration($objectType);\n $batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);\n $response = $batchConfig['api']->read($batchReadRequest);\n\n $this->validateApiResponse($response, $objectType);\n\n $results = $this->processApiResults($response);\n $this->logBatchResults($objectType, $crmIds, $results);\n\n return $results;\n } catch (\\Throwable $e) {\n $this->handleBatchError($e, $objectType, $crmIds);\n }\n }\n\n private function validateBatchSize(string $objectType, array $crmIds): void\n {\n if (count($crmIds) > 100) {\n throw new \\InvalidArgumentException(\"Batch size cannot exceed 100 {$objectType}\");\n }\n }\n\n private function createBatchConfiguration(string $objectType): array\n {\n $configurations = [\n 'deals' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Deals\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Deals\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->deals()->batchApi(),\n ],\n 'companies' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Companies\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Companies\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->companies()->batchApi(),\n ],\n 'contacts' => [\n 'batchReadRequest' => new \\HubSpot\\Client\\Crm\\Contacts\\Model\\BatchReadInputSimplePublicObjectId(),\n 'inputClass' => \\HubSpot\\Client\\Crm\\Contacts\\Model\\SimplePublicObjectId::class,\n 'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),\n ],\n ];\n\n if (! isset($configurations[$objectType])) {\n throw new \\InvalidArgumentException(\"Unsupported object type: {$objectType}\");\n }\n\n return $configurations[$objectType];\n }\n\n private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object\n {\n $batchReadRequest = $batchConfig['batchReadRequest'];\n $inputClass = $batchConfig['inputClass'];\n\n $inputs = array_map(function ($crmId) use ($inputClass) {\n $input = new $inputClass();\n $input->setId($crmId);\n\n return $input;\n }, $crmIds);\n\n $batchReadRequest->setInputs($inputs);\n $batchReadRequest->setProperties($fields);\n\n return $batchReadRequest;\n }\n\n private function validateApiResponse($response, string $objectType): void\n {\n if (! $response) {\n throw new CrmException(\"HubSpot API returned null response for {$objectType} batch read\");\n }\n }\n\n private function processApiResults($response): array\n {\n $results = [];\n $responseResults = $response->getResults();\n\n if ($responseResults) {\n foreach ($responseResults as $object) {\n if ($object && $object->getId()) {\n $results[$object->getId()] = [\n 'id' => $object->getId(),\n 'properties' => $object->getProperties() ?: [],\n ];\n }\n }\n }\n\n return $results;\n }\n\n private function logBatchResults(string $objectType, array $crmIds, array $results): void\n {\n $this->log->info(\"[HubSpot] Batch fetched {$objectType}\", [\n 'requested_count' => count($crmIds),\n 'returned_count' => count($results),\n 'crm_ids' => $crmIds,\n ]);\n }\n\n private function handleBatchError(\\Throwable $e, string $objectType, array $crmIds): void\n {\n $errorMessage = $e->getMessage() ?: 'Unknown error';\n $errorTrace = $e->getTraceAsString() ?: 'No trace available';\n\n $this->log->error(\"[HubSpot] Failed to batch fetch {$objectType}\", [\n 'crm_ids' => $crmIds,\n 'error' => $errorMessage,\n 'trace' => $errorTrace,\n ]);\n\n throw new CrmException(\"Failed to batch fetch {$objectType}: \" . $errorMessage);\n }\n\n /**\n * Batch read multiple opportunities by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot deal IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with opportunity data\n */\n public function getOpportunitiesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('deals', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple companies by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot company IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with company data\n */\n public function getCompaniesByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('companies', $crmIds, $fields);\n }\n\n /**\n * Batch read multiple contacts by their CRM IDs\n *\n * @param array<string> $crmIds Array of HubSpot contact IDs (max 100)\n * @param array<string> $fields Array of property names to fetch\n *\n * @return array<string, array> Array keyed by CRM ID with contact data\n */\n public function getContactsByIds(array $crmIds, array $fields): array\n {\n return $this->batchReadObjects('contacts', $crmIds, $fields);\n }\n\n /**\n * @throws CompanyApiException\n * @throws CrmException\n */\n public function getAccountById(string $crmId, array $fields): array\n {\n try {\n $company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(\n $crmId,\n implode(',', $fields),\n );\n } catch (CompanyApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch account', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $company instanceof CompaniesWithAssociations) {\n throw new CrmException('Account not found');\n }\n\n return [\n 'id' => $company->getId(),\n 'properties' => $company->getProperties(),\n ];\n }\n\n /**\n * @throws ContactApiException\n * @throws CrmException\n */\n public function getContactById(string $crmId, array $fields): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $crmId,\n implode(',', $fields)\n );\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'crm_id' => $crmId,\n 'reason' => $e->getMessage(),\n ]);\n\n throw $e;\n }\n\n if (! $contact instanceof ContactsWithAssociations) {\n throw new CrmException('Contact not found');\n }\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n }\n\n /**\n * This is email search request that Hubspot offers as GET (more generous quota)\n */\n public function getContactByEmail(string $email, array $fields = []): array\n {\n try {\n $contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(\n $email,\n implode(',', $fields),\n null,\n false,\n 'email'\n );\n\n return [\n 'id' => $contact->getId(),\n 'properties' => $contact->getProperties(),\n ];\n } catch (ContactApiException $e) {\n $this->log->info('[Hubspot] Failed to fetch contact', [\n 'email' => $email,\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n }\n\n /**\n * @throws CrmException\n */\n public function fetchProperty(string $objectType, string $propertyId): Property\n {\n $result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);\n\n if (! $result instanceof Property) {\n $this->log->error('[Hubspot] Failed to fetch property', [\n 'object_type' => $objectType,\n 'property_id' => $propertyId,\n 'reason' => $result->getMessage(),\n ]);\n\n throw new CrmException('Failed to fetch property');\n }\n\n return $result;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchPropertyOptions(string $objectType, string $propertyId): array\n {\n /** @var array<CrmFieldOption> */\n return $this->fetchProperty($objectType, $propertyId)->getOptions();\n }\n\n /**\n * @return array<array{id:string, label:string, deleted:bool}>\n */\n public function fetchCallDispositions(): array\n {\n /** @var Response $response */\n $response = $this->getInstance()->engagements()->getCallDispositions();\n\n /**\n * @var array<array{\n * id:string,\n * label:string,\n * deleted: bool\n * }>\n */\n return $response->toArray();\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityPipelineStages(): array\n {\n $stages = [];\n $apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');\n\n if ($apiResponse instanceof Error) {\n $this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $apiResponse->getMessage(),\n ]);\n\n return [];\n }\n\n foreach ($apiResponse->getResults() as $pipeline) {\n $pipelineStages = array_map(\n static function (PipelineStage $stage) {\n return [\n 'id' => $stage->getId(),\n 'label' => $stage->getLabel(),\n ];\n },\n $pipeline->getStages()\n );\n\n $stages = array_merge($stages, $pipelineStages);\n }\n\n return $stages;\n }\n\n public function fetchOpportunityPipelines(): array\n {\n $pipelines = [];\n\n try {\n $apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');\n } catch (\\Exception $e) {\n $this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [\n 'reason' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n $response = $apiResponse->toArray();\n\n foreach ($response['results'] as $pipeline) {\n $pipelines[] = [\n 'id' => $pipeline['id'],\n 'label' => $pipeline['label'],\n ];\n }\n\n return $pipelines;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchMeetingOutcomeFieldOptions(Field $field): array\n {\n return $field->getCrmProviderId() === 'meetingOutcome'\n ? $this->fetchMeetingOutcomeTypes()\n : $this->fetchCallActivityTypes();\n }\n\n public function fetchMeetingOutcomeTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/meeting/hs_meeting_outcome'\n );\n }\n\n public function fetchCallActivityTypes(): array\n {\n return $this->extractMeetingTypeOptions(\n 'https://api.hubapi.com/crm/v3/properties/call/hs_activity_type'\n );\n }\n\n private function extractMeetingTypeOptions(string $endpoint): array\n {\n /** @var Response $response */\n $response = $this->getInstance()\n ->getClient()\n ->request('GET', $endpoint);\n\n /**\n * @var array<array{\n * value: string,\n * label: string,\n * displayOrder: int\n * }> $optionData\n */\n $optionData = $response->toArray()['options'] ?? [];\n\n $options = [];\n foreach ($optionData as $item) {\n $options[] = [\n 'id' => $item['value'],\n 'value' => $item['value'],\n 'label' => $item['label'],\n 'display_order' => $item['displayOrder'],\n ];\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchDispositionFieldOptions(): array\n {\n $options = [];\n\n $dispositions = $this->fetchCallDispositions();\n\n foreach ($dispositions as $disposition) {\n if ($disposition['deleted'] !== false) {\n continue;\n }\n\n $option['value'] = $disposition['id'];\n $option['id'] = $disposition['id'];\n $option['label'] = $disposition['label'];\n\n $options[] = $option;\n }\n\n return $options;\n }\n\n /**\n * @return array<CrmFieldOption>\n */\n public function fetchOpportunityFieldOptions(Field $field): array\n {\n if ($field->isStageField()) {\n return $this->fetchOpportunityPipelineStages();\n }\n\n if ($field->isPipelineField()) {\n return $this->fetchOpportunityPipelines();\n }\n\n return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)\n {\n $endpoint = self::BASE_URL . $endpoint;\n\n if ($method === 'GET') {\n return $this->getInstance()->getClient()?->request(\n method: $method,\n endpoint: $endpoint,\n query_string: $queryString\n );\n } else {\n return $this->getInstance()->getClient()->request($method, $endpoint, [\n 'json' => ($payload),\n ]);\n }\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function createMeeting(array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings';\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n /**\n * @throws BadRequest\n * @throws HubspotException\n */\n public function updateMeeting(string $meetingId, array $payload): Response\n {\n $endpoint = '/crm/v3/objects/meetings/' . $meetingId;\n\n return $this->makeRequest($endpoint, 'PATCH', $payload);\n }\n\n /**\n * @throws \\Exception\n */\n public function createNote(\n string $body,\n string $ownerId,\n int $timestamp,\n string $objectId,\n NoteObject $noteObject\n ): ?string {\n try {\n $noteInput = new SimplePublicObjectInput([\n 'properties' => [\n 'hs_note_body' => $body,\n 'hubspot_owner_id' => $ownerId,\n 'hs_timestamp' => $timestamp,\n ],\n ]);\n\n // Create note\n $note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);\n\n $this->getNewInstance()->crm()->objects()->associationsApi()->create(\n 'note',\n $note->getId(),\n $this->getNoteObject($noteObject),\n $objectId,\n $this->getNoteAssociationType($noteObject),\n );\n\n return $note->getId();\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to create note', [\n 'objectId' => $objectId,\n 'noteObject' => $noteObject->getObjectType(),\n 'reason' => $e->getMessage(),\n ]);\n\n \\Sentry::captureException($e);\n }\n\n return null;\n }\n\n public function updateEngagement(string $objectId, array $engagement, array $metadata): void\n {\n $this->getInstance()->engagements()->update($objectId, $engagement, $metadata);\n }\n\n public function getEngagementData(string $engagementId): array\n {\n $engagement = $this->getInstance()->engagements()->get($engagementId);\n\n return $engagement->toArray();\n }\n\n public function createEngagement(array $engagement, array $associations, array $metadata): Response\n {\n return $this->getInstance()\n ->engagements()\n ->create($engagement, $associations, $metadata);\n }\n\n public function isUnauthorizedException(\\Exception $e): bool\n {\n // Check for specific HubSpot API exception types first\n if ($e instanceof BadRequest) {\n // BadRequest can contain 401 status codes\n return $e->getCode() === 401;\n }\n\n // Check for HTTP client exceptions with status codes\n if ($e instanceof \\GuzzleHttp\\Exception\\RequestException && $e->hasResponse()) {\n $response = $e->getResponse();\n if ($response !== null) {\n return $response->getStatusCode() === 401;\n }\n }\n\n // Check for Guzzle HTTP exceptions\n if ($e instanceof \\GuzzleHttp\\Exception\\ClientException) {\n return $e->getCode() === 401;\n }\n\n // Fallback to string matching as last resort, but be more specific\n $message = strtolower($e->getMessage());\n\n return str_contains($message, '401 unauthorized') ||\n str_contains($message, 'http 401') ||\n str_contains($message, 'status code 401') ||\n (preg_match('/\\b401\\b/', $message) && str_contains($message, 'unauthorized'));\n }\n\n /**\n * Validates and refreshes the access token if needed before API requests.\n * This ensures long-running processes don't fail due to token expiration.\n *\n * @throws SocialAccountTokenInvalidException\n */\n public function ensureValidToken(): void\n {\n if ($this->oauthAccount === null) {\n return;\n }\n\n $newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);\n if ($newToken !== null) {\n $this->accessToken = $newToken;\n }\n }\n\n public function getConfig()\n {\n return $this->config;\n }\n\n // returns only active (archived=false)\n public function getOwners(): array\n {\n return $this->getNewInstance()->crm()->owners()->getAll();\n }\n\n /**\n * @param bool $archived\n *\n * @return array<Owner>|[]\n */\n public function getOwnersArchived(bool $archived = true): array\n {\n $endpoint = '/crm/v3/owners';\n $queryParams = [\n 'archived' => $archived ? 'true' : 'false',\n ];\n $queryString = http_build_query($queryParams);\n\n $owners = [];\n\n try {\n $response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);\n $responseData = $response?->toArray();\n\n foreach ($responseData['results'] as $result) {\n try {\n $owners[] = Owner::create($result);\n } catch (Throwable $e) {\n $this->log->error('[HubSpot] Failed to process owner data', [\n 'result' => $result,\n 'error' => $e->getMessage(),\n ]);\n\n continue;\n }\n }\n } catch (Throwable $e) {\n $this->log->error('HubSpot] Failed to fetch owners', [\n 'archived' => $archived,\n 'error' => $e->getMessage(),\n ]);\n\n return [];\n }\n\n return $owners;\n }\n\n public function getMeeting(string $engagementId): ObjectWithAssociations\n {\n return $this->getNewInstance()->crm()->objects()->basicApi()\n ->getById('meeting', $engagementId, null, 'contact,company,deal');\n }\n\n public function deleteEngagement(string $engagementId): void\n {\n $this->getInstance()->engagements()->delete((int) $engagementId);\n }\n\n public function getAssociationsData(array $ids, string $fromObject, string $toObject): array\n {\n $associationData = [];\n $idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);\n\n foreach ($idChunks as $idChunk) {\n try {\n $batchInput = new \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchInputPublicObjectId();\n $batchInput->setInputs(array_map(function ($id) {\n $publicObjectId = new \\HubSpot\\Client\\Crm\\Associations\\Model\\PublicObjectId();\n $publicObjectId->setId($id);\n\n return $publicObjectId;\n }, $idChunk));\n\n $associatedObjectsData = $this\n ->getNewInstance()\n ->crm()\n ->associations()\n ->batchApi()\n ->read($fromObject, $toObject, $batchInput);\n\n if ($associatedObjectsData instanceof \\HubSpot\\Client\\Crm\\Associations\\Model\\BatchResponsePublicAssociationMulti) {\n foreach ($associatedObjectsData->getResults() as $association) {\n $from = $association->getFrom()->getId();\n $toAssociations = $association->getTo();\n\n if (! empty($toAssociations)) {\n $associationData[$from] = array_map(function ($item) {\n return $item->getId();\n }, $toAssociations);\n }\n }\n }\n// } catch (RateLimitException $e) {\n// throw $e;\n } catch (\\Exception $e) {\n $this->log->error('[Hubspot] Failed to fetch associations', [\n 'from_object' => $fromObject,\n 'to_object' => $toObject,\n 'reason' => $e->getMessage(),\n ]);\n }\n }\n\n return $associationData;\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteAssociationType(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'note_to_deal',\n NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it\n NoteObject::Account => 'note_to_company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n /**\n * @throws \\Exception\n */\n private function getNoteObject(NoteObject $noteObject): string\n {\n return match($noteObject) {\n NoteObject::Opportunity => 'deal',\n NoteObject::Lead, NoteObject::Contact => 'contact',\n NoteObject::Account => 'company',\n NoteObject::Call, NoteObject::Event => throw new \\Exception('Not supported'),\n };\n }\n\n public function addAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/create\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n\n public function removeAssociations(string $objectType, string $associationType, array $payload): Response\n {\n $endpoint = \"/crm/v4/associations/$objectType/$associationType/batch/archive\";\n\n return $this->makeRequest($endpoint, 'POST', $payload);\n }\n}","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false}]...
|
3072593486201138013
|
6378757149903685732
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
namespace Jiminny\Services\Crm\Hubspot;
use HubSpot\Client\Crm\Deals\ApiException as DealApiException;
use HubSpot\Client\Crm\Contacts\ApiException as ContactApiException;
use HubSpot\Client\Crm\Companies\ApiException as CompanyApiException;
use HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectWithAssociations as ContactsWithAssociations;
use HubSpot\Client\Crm\Companies\Model\SimplePublicObjectWithAssociations as CompaniesWithAssociations;
use HubSpot\Client\Crm\Deals\Model\SimplePublicObjectWithAssociations as DealWithAssociations;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectInput;
use HubSpot\Client\Crm\Objects\Model\SimplePublicObjectWithAssociations as ObjectWithAssociations;
use HubSpot\Client\Crm\Pipelines\Model\Error;
use HubSpot\Client\Crm\Pipelines\Model\PipelineStage;
use HubSpot\Client\Crm\Properties\Model\Property;
use HubSpot\Discovery\Discovery;
use Jiminny\Exceptions\CrmException;
use Jiminny\Exceptions\RateLimitException;
use Jiminny\Exceptions\SocialAccountTokenInvalidException;
use Jiminny\Jobs\Crm\NoteObject;
use Jiminny\Models\Crm\Field;
use Jiminny\Services\Crm\BaseClient;
use Jiminny\Services\Crm\Hubspot\DTO\Response\Owner;
use Jiminny\Services\SocialAccountService;
use SevenShores\Hubspot\Exceptions\BadRequest;
use SevenShores\Hubspot\Exceptions\HubspotException;
use SevenShores\Hubspot\Factory;
use SevenShores\Hubspot\Http\Response;
use Jiminny\Services\Crm\Hubspot\Pagination\HubspotPaginationService;
use Illuminate\Support\Facades\Redis;
use Throwable;
/**
* @phpstan-type CrmFieldOption array{id:string, label:string, value?:string}
*/
class Client extends BaseClient implements HubspotClientInterface
{
public const string MIN_API_VERSION = '2';
public const string BASE_URL = '[URL_WITH_CREDENTIALS] T
* @param callable(): T $apiCall
* @return T
*
* @throws RateLimitException
*/
private function executeRequest(callable $apiCall)
{
$cacheKey = $this->getRateLimitCacheKey();
$cachedRetryAfter = Redis::get($cacheKey);
if (is_string($cachedRetryAfter) && is_numeric($cachedRetryAfter)) {
throw new RateLimitException(
'Hubspot rate limit (cached circuit-breaker)',
(int) $cachedRetryAfter,
);
}
try {
return $apiCall();
} catch (Throwable $e) {
if ($this->isHubspotRateLimit($e)) {
$retryAfter = $this->parseRetryAfter($e);
Redis::setex($cacheKey, $retryAfter, (string) $retryAfter);
$this->log->warning('[Hubspot] Received 429 from API', [
'team_id' => $this->config->team_id,
'config_id' => $this->config->getId(),
'retry_after' => $retryAfter,
'message' => $this->parseMessage($e),
'reason' => $e->getMessage(),
]);
throw new RateLimitException('Hubspot returned 429', $retryAfter, $e);
}
throw $e;
}
}
private function getRateLimitCacheKey(): string
{
return sprintf('hubspot:ratelimit:portal:%d', $this->config->getId());
}
public function isHubspotRateLimit(Throwable $e): bool
{
if ($e instanceof BadRequest
|| $e instanceof DealApiException
|| $e instanceof ContactApiException
|| $e instanceof CompanyApiException
|| $e instanceof \GuzzleHttp\Exception\RequestException
) {
return (int) $e->getCode() === 429;
}
return false;
}
public function parseRetryAfter(Throwable $e): int
{
if (method_exists($e, 'getResponseHeaders')) {
$headers = $e->getResponseHeaders() ?: [];
$value = $headers['Retry-After'] ?? $headers['retry-after'] ?? null;
if (is_array($value)) {
$value = $value[0] ?? null;
}
if (is_numeric($value)) {
return (int) $value;
}
}
$message = strtolower($this->parseMessage($e));
if (str_contains($message, 'daily')) {
return 600;
}
if (str_contains($message, 'ten secondly')) {
return 10;
}
if (str_contains($message, 'secondly')) {
return 1;
}
$this->log->warning('[Hubspot] No retry-after header or known message, using default', [
'exception_class' => get_class($e),
'message' => $message,
]);
return 10;
}
public function parseMessage(Throwable $e): string
{
if (! method_exists($e, 'getResponseBody')) {
return '';
}
$body = $e->getResponseBody();
if (is_string($body)) {
$body = json_decode($body, true) ?? [];
}
if (! is_array($body)) {
return '';
}
return (string) ($body['message'] ?? '');
}
public function getMinimumApiVersion(): string
{
return self::MIN_API_VERSION;
}
public function getInstance(): Factory
{
return new Factory([
'key' => $this->accessToken,
'oauth2' => true,
'base_url' => $this->baseUrl,
]);
}
public function getNewInstance(): Discovery
{
return \HubSpot\Factory::createWithAccessToken($this->accessToken);
}
/**
* Secondly and daily limits for Hubspot API
*
* Product Tier: Free & Starter | Professional & Enterprise | API add-on (any tier)
* Burst: 100/10 seconds | 150/10 seconds | 200/10 seconds
* Daily: 250,000 | 500,000 | 1,000,000
*
* Official documentation states: The search endpoints are rate limited to five requests per second.
* Since with 5 RPS were still hitting secondly rate limits we lowered it to 4
*/
public function getPaginatedData(array $payload, string $type, int $offset = 0): array
{
$total = 0;
$lastId = null;
$rows = [];
foreach ($this->getPaginatedDataGenerator($payload, $type, $offset, $total, $lastId) as $row) {
$rows[] = $row;
}
return ['results' => $rows, 'total' => $total, 'last_record' => $lastId];
}
/**
* @throws HubspotException
* @throws SocialAccountTokenInvalidException
* @throws BadRequest
*/
public function getPaginatedDataGenerator(
array $payload,
string $type,
int $offset = 0,
int &$total = 0,
?string &$lastRecordId = null
): \Generator {
return $this->paginationService->getPaginatedDataGenerator(
$this,
$payload,
$type,
$offset,
$total,
$lastRecordId
);
}
/**
* Execute a search request against HubSpot CRM objects with rate limiting.
*
* @param string $objectType The object type ('deals', 'companies', 'contacts', 'calls')
* @param array<string, mixed> $payload The search payload with filters, sorts, properties, etc.
* @return array The search response with 'results', 'total', 'paging' keys
* @throws RateLimitException When rate limit is hit
* @throws HubspotException On API errors
*/
public function search(string $objectType, array $payload): array
{
$endpoint = self::BASE_URL . "/crm/v3/objects/{$objectType}/search";
return $this->executeRequest(function () use ($endpoint, $payload) {
$response = $this->getInstance()->getClient()->request('POST', $endpoint, ['json' => $payload]);
return $response->toArray();
});
}
/**
* @throws DealApiException
* @throws CrmException
*/
public function getOpportunityById(string $crmId, array $fields): array
{
try {
$deal = $this->getNewInstance()->crm()->deals()->basicApi()->getById(
$crmId,
implode(',', $fields),
'companies,contacts'
);
} catch (DealApiException $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $deal instanceof DealWithAssociations) {
throw new CrmException('Deal not found');
}
return [
'id' => $deal->getId(),
'properties' => $deal->getProperties(),
'associations' => $deal->getAssociations(),
];
}
/**
* Generic batch read method for HubSpot objects
*
* @param string $objectType The object type ('deals', 'companies', 'contacts')
* @param array<string> $crmIds Array of HubSpot object IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with object data
*/
private function batchReadObjects(string $objectType, array $crmIds, array $fields): array
{
if (empty($crmIds)) {
return [];
}
$this->validateBatchSize($objectType, $crmIds);
$this->ensureValidToken();
try {
$batchConfig = $this->createBatchConfiguration($objectType);
$batchReadRequest = $this->prepareBatchRequest($batchConfig, $crmIds, $fields);
$response = $batchConfig['api']->read($batchReadRequest);
$this->validateApiResponse($response, $objectType);
$results = $this->processApiResults($response);
$this->logBatchResults($objectType, $crmIds, $results);
return $results;
} catch (\Throwable $e) {
$this->handleBatchError($e, $objectType, $crmIds);
}
}
private function validateBatchSize(string $objectType, array $crmIds): void
{
if (count($crmIds) > 100) {
throw new \InvalidArgumentException("Batch size cannot exceed 100 {$objectType}");
}
}
private function createBatchConfiguration(string $objectType): array
{
$configurations = [
'deals' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Deals\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Deals\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->deals()->batchApi(),
],
'companies' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Companies\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Companies\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->companies()->batchApi(),
],
'contacts' => [
'batchReadRequest' => new \HubSpot\Client\Crm\Contacts\Model\BatchReadInputSimplePublicObjectId(),
'inputClass' => \HubSpot\Client\Crm\Contacts\Model\SimplePublicObjectId::class,
'api' => $this->getNewInstance()->crm()->contacts()->batchApi(),
],
];
if (! isset($configurations[$objectType])) {
throw new \InvalidArgumentException("Unsupported object type: {$objectType}");
}
return $configurations[$objectType];
}
private function prepareBatchRequest(array $batchConfig, array $crmIds, array $fields): object
{
$batchReadRequest = $batchConfig['batchReadRequest'];
$inputClass = $batchConfig['inputClass'];
$inputs = array_map(function ($crmId) use ($inputClass) {
$input = new $inputClass();
$input->setId($crmId);
return $input;
}, $crmIds);
$batchReadRequest->setInputs($inputs);
$batchReadRequest->setProperties($fields);
return $batchReadRequest;
}
private function validateApiResponse($response, string $objectType): void
{
if (! $response) {
throw new CrmException("HubSpot API returned null response for {$objectType} batch read");
}
}
private function processApiResults($response): array
{
$results = [];
$responseResults = $response->getResults();
if ($responseResults) {
foreach ($responseResults as $object) {
if ($object && $object->getId()) {
$results[$object->getId()] = [
'id' => $object->getId(),
'properties' => $object->getProperties() ?: [],
];
}
}
}
return $results;
}
private function logBatchResults(string $objectType, array $crmIds, array $results): void
{
$this->log->info("[HubSpot] Batch fetched {$objectType}", [
'requested_count' => count($crmIds),
'returned_count' => count($results),
'crm_ids' => $crmIds,
]);
}
private function handleBatchError(\Throwable $e, string $objectType, array $crmIds): void
{
$errorMessage = $e->getMessage() ?: 'Unknown error';
$errorTrace = $e->getTraceAsString() ?: 'No trace available';
$this->log->error("[HubSpot] Failed to batch fetch {$objectType}", [
'crm_ids' => $crmIds,
'error' => $errorMessage,
'trace' => $errorTrace,
]);
throw new CrmException("Failed to batch fetch {$objectType}: " . $errorMessage);
}
/**
* Batch read multiple opportunities by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot deal IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with opportunity data
*/
public function getOpportunitiesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('deals', $crmIds, $fields);
}
/**
* Batch read multiple companies by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot company IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with company data
*/
public function getCompaniesByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('companies', $crmIds, $fields);
}
/**
* Batch read multiple contacts by their CRM IDs
*
* @param array<string> $crmIds Array of HubSpot contact IDs (max 100)
* @param array<string> $fields Array of property names to fetch
*
* @return array<string, array> Array keyed by CRM ID with contact data
*/
public function getContactsByIds(array $crmIds, array $fields): array
{
return $this->batchReadObjects('contacts', $crmIds, $fields);
}
/**
* @throws CompanyApiException
* @throws CrmException
*/
public function getAccountById(string $crmId, array $fields): array
{
try {
$company = $this->getNewInstance()->crm()->companies()->basicApi()->getById(
$crmId,
implode(',', $fields),
);
} catch (CompanyApiException $e) {
$this->log->info('[Hubspot] Failed to fetch account', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $company instanceof CompaniesWithAssociations) {
throw new CrmException('Account not found');
}
return [
'id' => $company->getId(),
'properties' => $company->getProperties(),
];
}
/**
* @throws ContactApiException
* @throws CrmException
*/
public function getContactById(string $crmId, array $fields): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$crmId,
implode(',', $fields)
);
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'crm_id' => $crmId,
'reason' => $e->getMessage(),
]);
throw $e;
}
if (! $contact instanceof ContactsWithAssociations) {
throw new CrmException('Contact not found');
}
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
}
/**
* This is email search request that Hubspot offers as GET (more generous quota)
*/
public function getContactByEmail(string $email, array $fields = []): array
{
try {
$contact = $this->getNewInstance()->crm()->contacts()->basicApi()->getById(
$email,
implode(',', $fields),
null,
false,
'email'
);
return [
'id' => $contact->getId(),
'properties' => $contact->getProperties(),
];
} catch (ContactApiException $e) {
$this->log->info('[Hubspot] Failed to fetch contact', [
'email' => $email,
'reason' => $e->getMessage(),
]);
return [];
}
}
/**
* @throws CrmException
*/
public function fetchProperty(string $objectType, string $propertyId): Property
{
$result = $this->getNewInstance()->crm()->properties()->coreApi()->getByName($objectType, $propertyId);
if (! $result instanceof Property) {
$this->log->error('[Hubspot] Failed to fetch property', [
'object_type' => $objectType,
'property_id' => $propertyId,
'reason' => $result->getMessage(),
]);
throw new CrmException('Failed to fetch property');
}
return $result;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchPropertyOptions(string $objectType, string $propertyId): array
{
/** @var array<CrmFieldOption> */
return $this->fetchProperty($objectType, $propertyId)->getOptions();
}
/**
* @return array<array{id:string, label:string, deleted:bool}>
*/
public function fetchCallDispositions(): array
{
/** @var Response $response */
$response = $this->getInstance()->engagements()->getCallDispositions();
/**
* @var array<array{
* id:string,
* label:string,
* deleted: bool
* }>
*/
return $response->toArray();
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityPipelineStages(): array
{
$stages = [];
$apiResponse = $this->getNewInstance()->crm()->pipelines()->pipelinesApi()->getAll('deals');
if ($apiResponse instanceof Error) {
$this->log->error('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $apiResponse->getMessage(),
]);
return [];
}
foreach ($apiResponse->getResults() as $pipeline) {
$pipelineStages = array_map(
static function (PipelineStage $stage) {
return [
'id' => $stage->getId(),
'label' => $stage->getLabel(),
];
},
$pipeline->getStages()
);
$stages = array_merge($stages, $pipelineStages);
}
return $stages;
}
public function fetchOpportunityPipelines(): array
{
$pipelines = [];
try {
$apiResponse = $this->makeRequest('/crm/v3/pipelines/deals');
} catch (\Exception $e) {
$this->log->info('[Hubspot] Failed to fetch opportunity pipelines', [
'reason' => $e->getMessage(),
]);
return [];
}
$response = $apiResponse->toArray();
foreach ($response['results'] as $pipeline) {
$pipelines[] = [
'id' => $pipeline['id'],
'label' => $pipeline['label'],
];
}
return $pipelines;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchMeetingOutcomeFieldOptions(Field $field): array
{
return $field->getCrmProviderId() === 'meetingOutcome'
? $this->fetchMeetingOutcomeTypes()
: $this->fetchCallActivityTypes();
}
public function fetchMeetingOutcomeTypes(): array
{
return $this->extractMeetingTypeOptions(
'[URL_WITH_CREDENTIALS] Response $response */
$response = $this->getInstance()
->getClient()
->request('GET', $endpoint);
/**
* @var array<array{
* value: string,
* label: string,
* displayOrder: int
* }> $optionData
*/
$optionData = $response->toArray()['options'] ?? [];
$options = [];
foreach ($optionData as $item) {
$options[] = [
'id' => $item['value'],
'value' => $item['value'],
'label' => $item['label'],
'display_order' => $item['displayOrder'],
];
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchDispositionFieldOptions(): array
{
$options = [];
$dispositions = $this->fetchCallDispositions();
foreach ($dispositions as $disposition) {
if ($disposition['deleted'] !== false) {
continue;
}
$option['value'] = $disposition['id'];
$option['id'] = $disposition['id'];
$option['label'] = $disposition['label'];
$options[] = $option;
}
return $options;
}
/**
* @return array<CrmFieldOption>
*/
public function fetchOpportunityFieldOptions(Field $field): array
{
if ($field->isStageField()) {
return $this->fetchOpportunityPipelineStages();
}
if ($field->isPipelineField()) {
return $this->fetchOpportunityPipelines();
}
return $this->fetchPropertyOptions('deals', $field->getCrmProviderId());
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function makeRequest(string $endpoint, $method = 'GET', $payload = [], ?string $queryString = null)
{
$endpoint = self::BASE_URL . $endpoint;
if ($method === 'GET') {
return $this->getInstance()->getClient()?->request(
method: $method,
endpoint: $endpoint,
query_string: $queryString
);
} else {
return $this->getInstance()->getClient()->request($method, $endpoint, [
'json' => ($payload),
]);
}
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function createMeeting(array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings';
return $this->makeRequest($endpoint, 'POST', $payload);
}
/**
* @throws BadRequest
* @throws HubspotException
*/
public function updateMeeting(string $meetingId, array $payload): Response
{
$endpoint = '/crm/v3/objects/meetings/' . $meetingId;
return $this->makeRequest($endpoint, 'PATCH', $payload);
}
/**
* @throws \Exception
*/
public function createNote(
string $body,
string $ownerId,
int $timestamp,
string $objectId,
NoteObject $noteObject
): ?string {
try {
$noteInput = new SimplePublicObjectInput([
'properties' => [
'hs_note_body' => $body,
'hubspot_owner_id' => $ownerId,
'hs_timestamp' => $timestamp,
],
]);
// Create note
$note = $this->getNewInstance()->crm()->objects()->basicApi()->create('note', $noteInput);
$this->getNewInstance()->crm()->objects()->associationsApi()->create(
'note',
$note->getId(),
$this->getNoteObject($noteObject),
$objectId,
$this->getNoteAssociationType($noteObject),
);
return $note->getId();
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to create note', [
'objectId' => $objectId,
'noteObject' => $noteObject->getObjectType(),
'reason' => $e->getMessage(),
]);
\Sentry::captureException($e);
}
return null;
}
public function updateEngagement(string $objectId, array $engagement, array $metadata): void
{
$this->getInstance()->engagements()->update($objectId, $engagement, $metadata);
}
public function getEngagementData(string $engagementId): array
{
$engagement = $this->getInstance()->engagements()->get($engagementId);
return $engagement->toArray();
}
public function createEngagement(array $engagement, array $associations, array $metadata): Response
{
return $this->getInstance()
->engagements()
->create($engagement, $associations, $metadata);
}
public function isUnauthorizedException(\Exception $e): bool
{
// Check for specific HubSpot API exception types first
if ($e instanceof BadRequest) {
// BadRequest can contain 401 status codes
return $e->getCode() === 401;
}
// Check for HTTP client exceptions with status codes
if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {
$response = $e->getResponse();
if ($response !== null) {
return $response->getStatusCode() === 401;
}
}
// Check for Guzzle HTTP exceptions
if ($e instanceof \GuzzleHttp\Exception\ClientException) {
return $e->getCode() === 401;
}
// Fallback to string matching as last resort, but be more specific
$message = strtolower($e->getMessage());
return str_contains($message, '401 unauthorized') ||
str_contains($message, 'http 401') ||
str_contains($message, 'status code 401') ||
(preg_match('/\b401\b/', $message) && str_contains($message, 'unauthorized'));
}
/**
* Validates and refreshes the access token if needed before API requests.
* This ensures long-running processes don't fail due to token expiration.
*
* @throws SocialAccountTokenInvalidException
*/
public function ensureValidToken(): void
{
if ($this->oauthAccount === null) {
return;
}
$newToken = $this->tokenManager->ensureValidToken($this->oauthAccount);
if ($newToken !== null) {
$this->accessToken = $newToken;
}
}
public function getConfig()
{
return $this->config;
}
// returns only active (archived=false)
public function getOwners(): array
{
return $this->getNewInstance()->crm()->owners()->getAll();
}
/**
* @param bool $archived
*
* @return array<Owner>|[]
*/
public function getOwnersArchived(bool $archived = true): array
{
$endpoint = '/crm/v3/owners';
$queryParams = [
'archived' => $archived ? 'true' : 'false',
];
$queryString = http_build_query($queryParams);
$owners = [];
try {
$response = $this->makeRequest(endpoint: $endpoint, queryString: $queryString);
$responseData = $response?->toArray();
foreach ($responseData['results'] as $result) {
try {
$owners[] = Owner::create($result);
} catch (Throwable $e) {
$this->log->error('[HubSpot] Failed to process owner data', [
'result' => $result,
'error' => $e->getMessage(),
]);
continue;
}
}
} catch (Throwable $e) {
$this->log->error('HubSpot] Failed to fetch owners', [
'archived' => $archived,
'error' => $e->getMessage(),
]);
return [];
}
return $owners;
}
public function getMeeting(string $engagementId): ObjectWithAssociations
{
return $this->getNewInstance()->crm()->objects()->basicApi()
->getById('meeting', $engagementId, null, 'contact,company,deal');
}
public function deleteEngagement(string $engagementId): void
{
$this->getInstance()->engagements()->delete((int) $engagementId);
}
public function getAssociationsData(array $ids, string $fromObject, string $toObject): array
{
$associationData = [];
$idChunks = array_chunk($ids, self::ASSOCIATIONS_BATCH_SIZE_LIMIT);
foreach ($idChunks as $idChunk) {
try {
$batchInput = new \HubSpot\Client\Crm\Associations\Model\BatchInputPublicObjectId();
$batchInput->setInputs(array_map(function ($id) {
$publicObjectId = new \HubSpot\Client\Crm\Associations\Model\PublicObjectId();
$publicObjectId->setId($id);
return $publicObjectId;
}, $idChunk));
$associatedObjectsData = $this
->getNewInstance()
->crm()
->associations()
->batchApi()
->read($fromObject, $toObject, $batchInput);
if ($associatedObjectsData instanceof \HubSpot\Client\Crm\Associations\Model\BatchResponsePublicAssociationMulti) {
foreach ($associatedObjectsData->getResults() as $association) {
$from = $association->getFrom()->getId();
$toAssociations = $association->getTo();
if (! empty($toAssociations)) {
$associationData[$from] = array_map(function ($item) {
return $item->getId();
}, $toAssociations);
}
}
}
// } catch (RateLimitException $e) {
// throw $e;
} catch (\Exception $e) {
$this->log->error('[Hubspot] Failed to fetch associations', [
'from_object' => $fromObject,
'to_object' => $toObject,
'reason' => $e->getMessage(),
]);
}
}
return $associationData;
}
/**
* @throws \Exception
*/
private function getNoteAssociationType(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'note_to_deal',
NoteObject::Lead, NoteObject::Contact => 'note_to_contact', // or 'note_to_lead' if your portal supports it
NoteObject::Account => 'note_to_company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
/**
* @throws \Exception
*/
private function getNoteObject(NoteObject $noteObject): string
{
return match($noteObject) {
NoteObject::Opportunity => 'deal',
NoteObject::Lead, NoteObject::Contact => 'contact',
NoteObject::Account => 'company',
NoteObject::Call, NoteObject::Event => throw new \Exception('Not supported'),
};
}
public function addAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/create";
return $this->makeRequest($endpoint, 'POST', $payload);
}
public function removeAssociations(string $objectType, string $associationType, array $payload): Response
{
$endpoint = "/crm/v4/associations/$objectType/$associationType/batch/archive";
return $this->makeRequest($endpoint, 'POST', $payload);
}
}...
|
18335
|
NULL
|
NULL
|
NULL
|
|
18339
|
793
|
24
|
2026-05-11T11:12:13.741903+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497933741_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js%9 JY-20725-h PhostormVIewINavicarecodeFV faVsco.js%9 JY-20725-handle-HS-search-rate-limroledey© BatchSyncCollectore balchsynckealsse© ClosedDealStagesS © RateLimitExcepDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspot lokenmanC) PavloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTO> M SiltersD JobsD ProspectSearchStra102W sevice lraits© DataClient.php© DecorateActivity.pr©LocalSearch.phpu LocalSearchintertac© RemoteSearch.phpc) Service.phpv _ Listeners© ConvertLeadActivitc) PurceLookuocache› D Metadata> MiarationPipedrivev Salesforce• D FieldsM OnnortunitvMatcheOpportunitySyncSti117M ProsneetSearchStr.ServiceTraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait121© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)© CachedCrmServiceDecorator.phpclass Cllent extends Baseclient 1mpLements Hubspotclientintertaceorivate tunction executerequestcallable saoivauueltry{return $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {Snotnvifton - Sthic-snancoPotnvdfton/Con•Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),"retry after = sretryAtter=> $this->parseMessage|($e),Cascade I Tl= se->qetressaceorCommand 21: 'Hubspot returned 429'. SretrvAfter. Se):throw $e;1 usageprivate function getRateLimitCacheKey(): stringreturn sprintf( format: 'hubspot:ratelimit:portal:%d', $this->config->getId());public function isHubspotRateLimit(Throwable $e): boolif (Se instanceof BadRequestII $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionII Se instanceof CompanyApiExceptionIl Se instanceofbuzzlehtro exceotzon request-xceptzonreturn (ant) Se->qetcode0 === 429%HubSpot/Service.phpProviderkateLimiter.ong=| A2 A67 23 ^1111111$0Preparation for Refi... in 48m100% 1Mon 11 May 14:12:13A console [PROD]A console (EU]A console [STAGING]s\Command: :run Memory usage before starting command {"comEntitles Startind Es undate worken "oid":12650."workerlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":615te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jicurned empty result, caching che missfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.". errorivoe":"KAId", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching {"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ Local search hit ("identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStantina CRM data matchina Siactivity".te single target {"target":"activities"rch ] Entity added to Redis list {"ent:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. {"mode":"legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {";1 Rate limit caught.releasing job withStarting CRM data matching {"activity",te single target ""target": "activitles'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetchind token -"socialAccountld":1499Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."leoaaration owner matched as CRM Owner ""objects/contact/search' resulte...
|
NULL
|
-697119328602921120
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicarecodeFV faVsco.js%9 JY-20725-h PhostormVIewINavicarecodeFV faVsco.js%9 JY-20725-handle-HS-search-rate-limroledey© BatchSyncCollectore balchsynckealsse© ClosedDealStagesS © RateLimitExcepDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspot lokenmanC) PavloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTO> M SiltersD JobsD ProspectSearchStra102W sevice lraits© DataClient.php© DecorateActivity.pr©LocalSearch.phpu LocalSearchintertac© RemoteSearch.phpc) Service.phpv _ Listeners© ConvertLeadActivitc) PurceLookuocache› D Metadata> MiarationPipedrivev Salesforce• D FieldsM OnnortunitvMatcheOpportunitySyncSti117M ProsneetSearchStr.ServiceTraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait121© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)© CachedCrmServiceDecorator.phpclass Cllent extends Baseclient 1mpLements Hubspotclientintertaceorivate tunction executerequestcallable saoivauueltry{return $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {Snotnvifton - Sthic-snancoPotnvdfton/Con•Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),"retry after = sretryAtter=> $this->parseMessage|($e),Cascade I Tl= se->qetressaceorCommand 21: 'Hubspot returned 429'. SretrvAfter. Se):throw $e;1 usageprivate function getRateLimitCacheKey(): stringreturn sprintf( format: 'hubspot:ratelimit:portal:%d', $this->config->getId());public function isHubspotRateLimit(Throwable $e): boolif (Se instanceof BadRequestII $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionII Se instanceof CompanyApiExceptionIl Se instanceofbuzzlehtro exceotzon request-xceptzonreturn (ant) Se->qetcode0 === 429%HubSpot/Service.phpProviderkateLimiter.ong=| A2 A67 23 ^1111111$0Preparation for Refi... in 48m100% 1Mon 11 May 14:12:13A console [PROD]A console (EU]A console [STAGING]s\Command: :run Memory usage before starting command {"comEntitles Startind Es undate worken "oid":12650."workerlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":615te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jicurned empty result, caching che missfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.". errorivoe":"KAId", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching {"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ Local search hit ("identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStantina CRM data matchina Siactivity".te single target {"target":"activities"rch ] Entity added to Redis list {"ent:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. {"mode":"legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {";1 Rate limit caught.releasing job withStarting CRM data matching {"activity",te single target ""target": "activitles'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetchind token -"socialAccountld":1499Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."leoaaration owner matched as CRM Owner ""objects/contact/search' resulte...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18338
|
792
|
26
|
2026-05-11T11:12:13.785841+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497933785_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:13181DEV (docker)-zshDOCKERcompiledeventsroutesviews181DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
7679717790808982792
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:13181DEV (docker)-zshDOCKERcompiledeventsroutesviews181DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18341
|
792
|
27
|
2026-05-11T11:12:18.739230+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497938739_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:18181DEV (docker)-zshDOCKERcompiledeventsroutesviews₴81DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
5343700727861454160
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:18181DEV (docker)-zshDOCKERcompiledeventsroutesviews₴81DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0; startejiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
18338
|
NULL
|
NULL
|
NULL
|
|
18340
|
793
|
25
|
2026-05-11T11:12:18.767079+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497938767_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-2 PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-20725-handle-HS-search-rate-limiroledey© TrackAutomatedReportGeneratedEvent.php© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconverteclass Cllent extends Baseclient 1mpLements Hubspotclientintertacee Hubspotclientinterc) Hubspot lokenman© PayloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTO> M SiltersD Jobs> D ProspectSearchStra102W service lralts© DataClient.php© DecorateActivity.prc Localsearch.oneu LocalSearchintertac© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache> Metadata> MiarationO Pipedrivev Salesforce• D FieldsM OnnortunitvMatche116OpportunitySyncSti117M ProsneetSearchStr.Service TraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait121© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)orivate tunction executerequestcallable saoivauueltrytreturn $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {SretryAfter = $this->parseRetryAfter(Se);Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),"retry after = sretryatter,= Se->qethessaqeoithrow new RatelimitExcention message:'Hubspot returned 429', SretryAfter, $e);throw $e;1 usagenrivate function getRateLimitCacheKevo• strinoneturn sorintfd formata'hubspot:ratelimit:portal:%d', $this->config->getId());Tusagepublic function isHubspotRateLimit(Throwable Se): boolif ($e instanceof BadRequestII $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionIl Se instanceof CompanyApiExceptionI1 Se instanceof \GuzzleHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;return false:HubSpot/Service.php| A2 A67 X3 A VMII 1I II IIII1 111TII$0halPreparation for Refi... in 48m100% 18• Mon 11 May 14:12:18&console [pRODlA console (EU]A console [STAGING]E laravel.log xs\Command: :run Memory usage before starting command {"comEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":615te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "Legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {";1 Doto 14nd+ couch+releasing job withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticipants old state {"activity":6143Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Owner <"cbjects/contact/search' resulte...
|
NULL
|
-6324609191441562431
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-2 PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-20725-handle-HS-search-rate-limiroledey© TrackAutomatedReportGeneratedEvent.php© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconverteclass Cllent extends Baseclient 1mpLements Hubspotclientintertacee Hubspotclientinterc) Hubspot lokenman© PayloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTO> M SiltersD Jobs> D ProspectSearchStra102W service lralts© DataClient.php© DecorateActivity.prc Localsearch.oneu LocalSearchintertac© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache> Metadata> MiarationO Pipedrivev Salesforce• D FieldsM OnnortunitvMatche116OpportunitySyncSti117M ProsneetSearchStr.Service TraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait121© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)orivate tunction executerequestcallable saoivauueltrytreturn $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {SretryAfter = $this->parseRetryAfter(Se);Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),"retry after = sretryatter,= Se->qethessaqeoithrow new RatelimitExcention message:'Hubspot returned 429', SretryAfter, $e);throw $e;1 usagenrivate function getRateLimitCacheKevo• strinoneturn sorintfd formata'hubspot:ratelimit:portal:%d', $this->config->getId());Tusagepublic function isHubspotRateLimit(Throwable Se): boolif ($e instanceof BadRequestII $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionIl Se instanceof CompanyApiExceptionI1 Se instanceof \GuzzleHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;return false:HubSpot/Service.php| A2 A67 X3 A VMII 1I II IIII1 111TII$0halPreparation for Refi... in 48m100% 18• Mon 11 May 14:12:18&console [pRODlA console (EU]A console [STAGING]E laravel.log xs\Command: :run Memory usage before starting command {"comEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":615te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "Legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {";1 Doto 14nd+ couch+releasing job withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticipants old state {"activity":6143Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Owner <"cbjects/contact/search' resulte...
|
18339
|
NULL
|
NULL
|
NULL
|
|
18342
|
792
|
28
|
2026-05-11T11:12:22.863675+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497942863_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:22181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
1048676586980514719
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:22181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18343
|
793
|
26
|
2026-05-11T11:12:22.864940+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497942864_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-2 PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-20725-handle-HS-search-rate-limiroledey© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconverteclass Cllent extends Baseclient 1mpLements Hubspotclientintertacee Hubspotclientinterc) Hubspot lokenmanC) PavloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTOD FiltersD JobsD ProspectSearchStra102W service lralts© DataClient.php© DecorateActivity.pr©LocalSearch.phpu LocalSearchintertac© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache› D Metadata> MiarationO Pipedrivev Salesforce• D FieldsM OnnortunitvMatche116OpportunitySyncSti117M ProsneetSearchStr.Service TraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait121© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)orivate tunction executerequestcallable saoivauueltrytreturn $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {SretryAfter = $this->parseRetryAfter($e);Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),retry after = sretryAtter=> $e->qetMessageOllBACAANA 901FI1):Command &lExtract Surroundthrow new RatelimitExcentionn'Hubspot returned 429', SretryAfter, $e);throw $e;1 usagenrivate function getRateLimitCacheKevo• strinoneturn sorintfd formata'hubspot:ratelimit:portal:%d', $this->config->getId());Tusagepublic function isHubspotRateLimit(Throwable Se): boolif ($e instanceof BadRequestII $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionIl Se instanceof CompanyApiExceptionI1 Se instanceof \GuzzleHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;return false:HubSpot/Service.php| A2 A67 X3 A VNNN$0halPreparation for Refi... in 48m100% 18• Mon 11 May 14:12:22&console [pRODIA console (EU]A console [STAGING]E laravel.log xs\Command::run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":61.te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.". errorivoe":"KAIHd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching {"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"och1 Entitv added to Pedic lict fient:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method f"1 Rate limit cauahtreleasing job withStarting CRM data matching {"activity",te single target ""target": "activitles'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetchind token -"socialAccountld":1499Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."leoaaration owner matched as CRM Owner ""objects/contact/search' resulte...
|
NULL
|
1432801083172334174
|
NULL
|
click
|
ocr
|
NULL
|
PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-2 PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-20725-handle-HS-search-rate-limiroledey© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconverteclass Cllent extends Baseclient 1mpLements Hubspotclientintertacee Hubspotclientinterc) Hubspot lokenmanC) PavloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTOD FiltersD JobsD ProspectSearchStra102W service lralts© DataClient.php© DecorateActivity.pr©LocalSearch.phpu LocalSearchintertac© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache› D Metadata> MiarationO Pipedrivev Salesforce• D FieldsM OnnortunitvMatche116OpportunitySyncSti117M ProsneetSearchStr.Service TraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait121© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)orivate tunction executerequestcallable saoivauueltrytreturn $apiCall();} catch (Throwable $e) €if ($this->isHubspotRateLimit($e)) {SretryAfter = $this->parseRetryAfter($e);Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),retry after = sretryAtter=> $e->qetMessageOllBACAANA 901FI1):Command &lExtract Surroundthrow new RatelimitExcentionn'Hubspot returned 429', SretryAfter, $e);throw $e;1 usagenrivate function getRateLimitCacheKevo• strinoneturn sorintfd formata'hubspot:ratelimit:portal:%d', $this->config->getId());Tusagepublic function isHubspotRateLimit(Throwable Se): boolif ($e instanceof BadRequestII $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionIl Se instanceof CompanyApiExceptionI1 Se instanceof \GuzzleHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;return false:HubSpot/Service.php| A2 A67 X3 A VNNN$0halPreparation for Refi... in 48m100% 18• Mon 11 May 14:12:22&console [pRODIA console (EU]A console [STAGING]E laravel.log xs\Command::run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":61.te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.". errorivoe":"KAIHd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching {"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"och1 Entitv added to Pedic lict fient:Participants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method f"1 Rate limit cauahtreleasing job withStarting CRM data matching {"activity",te single target ""target": "activitles'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetchind token -"socialAccountld":1499Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."leoaaration owner matched as CRM Owner ""objects/contact/search' resulte...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18344
|
792
|
29
|
2026-05-11T11:12:24.788957+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497944788_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5685266402682420683
|
-8926130836387591936
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:24181DEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
18342
|
NULL
|
NULL
|
NULL
|
|
18346
|
793
|
27
|
2026-05-11T11:12:29.172860+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497949172_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3299086470291663550
|
-8349389703787247352
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
PhostormVIewINavicareCodeWindowFV faVsco.js%9 JY-20725-handle-HS-search-rate-limiroledey© TrackAutomatedReportGeneratedEvent.php© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconverteclass Cllent extends Baseclient 1mpLements Hubspotclientintertacee Hubspotclientinterc) Hubspot lokenmanC) PavloadBuilder.phpC) Remotecrmobiectr© ResponseNormalizec) Service.onr© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAor> O AccessorsConfigD DTOD FiltersD JobsD ProspectSearchStraW service lralts© DataClient.php© DecorateActivity.prc Localsearch.one1031u LocalSearchintertac© RemoteSearch.phpc) Service.phpv W Listenersc) ConvertLeadActivitc) PurceLookuocache> Metadata> MiarationO Pipedrivev Salesforce• D FieldsM OnnortunitvMatche116OpportunitySyncSti117M ProsneetSearchStr.ServiceTraitsC) Client nhr©DecorateActivity.pt. Delete@biectsTrait© FieldDefinitions.php123© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)orivate tunction executerequestcallable saoivauueltry{return $apiCall();} catch (Throwable $e) {if ($this->isHubspotRate|imit($e)) {$retryAfter = $this->parseRetryAfter($e);Redis: :setex($cacheKey, $retryAfter, (string) $retryAfter);$this->log->warning('[Hubspot] Received 429 from API', ['team 1d'= sth1s->cont10->team 10cont10 1d'= $this->config->getId(),"retry after = sretryAtter= se-›gethessageonthrow new RateLimitException( message:) 'Hubspot returned 429', SretryAfter, $e);throw $e;1 usagenrivate function getRateLimitCacheKevo• strinoneturn sorintfd formata'hubspot:ratelimit:portal:%d', $this->config->getId());Tusagepublic function isHubspotRateLimit(Throwable $e): boolif ($e instanceof BadRequestIl $e instanceof DealApiExceptionII $e instanceof ContactApiExceptionIl Se instanceof CompanyApiExceptionI1 Se instanceof \GuzzleHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;return false:HubSpot/Service.php| A2 A67 X3 A VMI11 MII1TIIMII 1$0halPreparation for Refi... in 48m100% 58• Mon 11 May 14:12:28&console [pRODlA console (EU]A console [STAGING]E laravel.log xs\Command: :run Memory usage before starting command {"comEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":61.te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "Legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {"1 Doto 14nd+ couch+releasing job withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticipants old state {"activity":6143Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generating access token. {"mode". "leo:aration owner matched as CRM Owner <"cbjects/contact/search' resulte...
|
18343
|
NULL
|
NULL
|
NULL
|
|
18345
|
792
|
30
|
2026-05-11T11:12:29.172903+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497949172_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3299086470291663550
|
-8349389703787247352
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 mDEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5100% <78• Mon 11 May 14:12:28181-zsh+screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18347
|
792
|
31
|
2026-05-11T11:12:34.250599+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497954250_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-964503098742680800
|
-8740352678700184768
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
Previous Highlighted Error
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 mDEV (docker)-zshDOCKERcompiledeventsroutesviews•₴1DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5100% <78• Mon 11 May 14:12:33181-zsh+screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONEDEV...
|
18345
|
NULL
|
NULL
|
NULL
|
|
18348
|
793
|
28
|
2026-05-11T11:12:34.262229+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497954262_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JY-20725-handle-HS-search-rate-limit, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.09541223,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: JY-20725-handle-HS-search-rate-limit","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.82413566,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"HandleHubspotRateLimitTest","depth":6,"bounds":{"left":0.8394282,"top":0.019952115,"width":0.076130316,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'HandleHubspotRateLimitTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.50731385,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"67","depth":4,"bounds":{"left":0.51728725,"top":0.17478053,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.52925533,"top":0.17478053,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"}]...
|
7750778324264792027
|
-8740265267525727424
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
JY-20725-handle-HS-search Project: faVsco.js, menu
JY-20725-handle-HS-search-rate-limit, menu
Start Listening for PHP Debug Connections
HandleHubspotRateLimitTest
Run 'HandleHubspotRateLimitTest'
Debug 'HandleHubspotRateLimitTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Sync Changes
Hide This Notification
Code changed:
Hide
2
67
3
PhostormFV faVsco.jsVIewINavicareCodeLaravel%9 JY-20725-handle-HS-search-rate-limitKeractorTOOISProject© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspotlokenman© PayloadBuilder.phpC) Remotecrmobiectr© ResponseNormalize125c) Service.onr127© SyncFieldAction.phC) SvncRelatedActivitC) WebhookSvncBatclv MintearationAorM AcceccorsConfig132D DTOD FiltersD JobsProspectSearchStra134135136W sevice lraits© DataClient.php138© DecorateActivity.ph©LocalSearch.php® LocalSearchinterfar© RemoteSearch.php140141142c) Service.phpv D Listeners144© ConvertLeadActivitc) PurceLookuocache146› D Metadata> Miarationia Pioedrive150v Salesforce151• D FieldsM OnnortunitvMatche152OpportunitySyncSti153M ProsneetSearchStr.154• M ServiceTraitcC) Client nhr© DecorateActivity.pt. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php1601© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)class Cllent extends Baseclient 1mpLements Hubspotclientintertacenubu1etunction 1shubspotrateuimithrowaole se: 000lII $e instanceof \GuzzleHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;recurn talse• public function barseRetryAfter(Throwable Se): intmethod exastsSe.|'getResponseHeaders')) {Sheaders = $e->getResponseHeaders() ?: [1;svalue = Sheadens|"Retrv-Aften' ? Sheadens"retrv-aften' ? null:if (is_array($value)) €Svalue = Svaluel0l 22 nuleif (is_numeric($value)) {return (int) $valve;Smessage = strtolower ($this->parseMessage($e));if (str_contains($message, 'daily')) {if (str_contains($message, 'ten secondly')) {recurn 10if (str_contains($message, 'secondly')) {return 1Sthis->log->warning(' [Hubspot] No retry-after header or known message, using default', ['exception_class' => get_class($e),1 usagepublic function parseMessage(Throwable $e): stringHudspol/serwice.pnp| A2 A67 X3 A VIII / HIH$0halPreparation for Refi... in 48m100% 18• Mon 11 May 14:12:33&console [pRODIA console (EU]A console [STAGING]s\Command: :run Memory usage before starting command {"comEntitles Startind Es undate worker "oid":12650. "workenlid"*"s\Command: :run Memory usage for command {"cStarting CRM data matching {"activity":615te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target ""target": "activities'rch ] Entity added to Redis list f"entiParticinants old state "'activity":6144Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {";1 Rate limit caught. releasing iob withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Ownen {"crbjects/contact/search' resulte...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18349
|
792
|
32
|
2026-05-11T11:12:41.350555+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497961350_m1.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:40181DEV (docker)-zshDOCKERcompiledeventsroutesviews181DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
-8006928121485343487
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp(ahlPreparation for Refi... in 48 m100% <78• Mon 11 May 14:12:40181DEV (docker)-zshDOCKERcompiledeventsroutesviews181DEV (docker)$2APP (-zsh)*3Jiminny-worker-processing-2:jiminny-worker-processing-2_00: stoppedjiminny-worker-processing-3:jiminny-worker-processing-3_00: stoppedjiminny-worker-processing-4:jiminny-worker-processing-4_00: stoppedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: stoppedworker-analytics:worker-analytics_00: stoppedjiminny-worker-processing-5:jiminny-worker-processing-5_00: stoppedworker-crm-update:worker-crm-update_00: stoppedworker-download:worker-download_00:stoppedworker-nudges:worker-nudges_00:stoppedjiminny-worker-processing-1:jiminny-worker-processing-1_00: stoppedworker-emails:worker-emails_00: stoppedworker:worker_00: stoppedworker-audio:worker-audio_00: stoppedworker-calendar:worker-calendar_00:stoppedworker-conferences:worker-conferences_00: stoppedworker-crm-sync:worker-crm-sync_00:stoppedworker-es-update:worker-es-update_00: stoppedartisan-schedule:artisan-schedule_00: stoppedartisan-schedule:artisan-schedule_00: startedjiminny-worker-processing-1:jiminny-worker-processing-1_00: startedjiminny-worker-processing-2:jiminny-worker-processing-2_00: startedsing-1 0: startedjiminny-worker-processing-3:jiminny-worker-processing-3_00: startedjiminny-worker-processing-4:jiminny-worker-processing-4_00: startedjiminny-worker-processing-5:jiminny-worker-processing-5_00: startedjiminny-worker-processing-delayed: jiminny-worker-processing-delayed_00: startedworker:worker_00: startedworker-analytics:worker-analytics_00: startedworker-audio:worker-audio_00: startedworker-calendar:worker-calendar_00:startedworker-conferences:worker-conferences_00: startedworker-crm-sync:worker-crm-sync_00: startedworker-crm-update:worker-crm-update_00: startedworker-download:worker-download_00: startedworker-emails:worker-emails_00: startedworker-es-update:worker-es-update_00:startedworker-nudges:worker-nudges_00: startedroot@docker_lamp_1:/home/jiminny#php artisan jiminny:debugDispatching 100 MatchActivityCrmDatajobs (portal=2)Done.Watch logs and runjiminny:debug observeRateLimit to inspect cachestate.root@docker_lamp_1:/home/jiminny# ]84-zshX5screenpipe"O ₴62.01ms DONE1.32ms DONE1.13ms DONE15.28ms DONE-zsh+DEV...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
18350
|
793
|
29
|
2026-05-11T11:12:41.387371+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-11/1778 /Users/lukas/.screenpipe/data/data/2026-05-11/1778497961387_m2.jpg...
|
PhpStorm
|
faVsco.js – Client.php
|
True
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormFV faVsco.jsVIewINavicareCodeLaravel%9 JY- PhostormFV faVsco.jsVIewINavicareCodeLaravel%9 JY-20725-handle-HS-search-rate-limiKeractorProject© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspotlokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalize125c) Service.onr© SyncFieldAction.phC) SvncRelatedActivit127C) WebhookSvncBatclv MintearationAor> O Accessors130ConfigD DTOD FiltersD JobsProspectSearchStraW sevice lraits© DataClient.php© DecorateActivity.ph©LocalSearch.phpu Localsearchinteria© RemoteSearch.php132134135136142c) Service.phpv W Listeners© ConvertLeadActivitc) PurceLookuocache› D Metadata> Miarationa Pioedrivev Salesforce150151• D FieldsM OnnortunitvMatcheOpportunitySyncSti153M ProsneetSearchStr.154• M ServiceTraitcC) Client nhr© DecorateActivity.pt. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)class Cllent extends Baseclient 1mpLements Hubspotclientintertacenubu1etunction 1shubspotrateuimithrowaole se: 000lII $e instanceof \GuzzLeHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;recurn talsepubuac function parseRetrvAfterThrowable Se: 1nt1f method existsSe.'getResponseHeaders')) {Sheaders = $e->getResponseHeaders() ?: [1;svalue = Sheadersl'Retry-After'J ?? Sheadersl'retry-after"J ?? null;if (is_array($value)) €Svalue = Svaluel0l 22 nuleif (is_numeric($value)) {return (int) $valve;Smessage = strtolower ($this->$e->getMessage()($e));if (str_contains($message, 'daily')) {if (str_contains($message, 'ten secondly')) {recurn 10if (str_contains($message, 'secondly')) {return 1Sthis->log->warning(' [Hubspot] No retry-after header or known message, using default', I'exception_class' => get_class($e),1 usagepublic function parseMessage(Throwable $e): stringHudspol/serwice.pnp| A2 A67 X3 A VM1/ 1011TII1l 111$0halPreparation for Refi... in 48m100% 58• Mon 11 May 14:12:40&console [pRODIA console (EU]A console [STAGING]E laravel.log >s\Command: :run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command f{"Starting CRM data matching {"activity":te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target *"target":"activities'rch ] Entity added to Redis list f"entiParticinants old state ""activitv:044Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {"1 Rate limit caught. releasing iob withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Ownen {"crbjects/contact/search' resulte...
|
NULL
|
6599567422634823440
|
NULL
|
click
|
ocr
|
NULL
|
PhostormFV faVsco.jsVIewINavicareCodeLaravel%9 JY- PhostormFV faVsco.jsVIewINavicareCodeLaravel%9 JY-20725-handle-HS-search-rate-limiKeractorProject© BatchSyncCollectore balchsynckealsse* SyncCrmEntities Trait.php© CachedCrmServiceDecorator.php© ClosedDealStagesS © RateLimitException.phpDealrielasservice.gc)Decorateacuivilv.or© FieldDefinitions.phpC) FieldT vpeconvertee Hubspotclientinterc) Hubspotlokenman© PayloadBuilder.phpC) RemotecrmobiectrP ResponseNormalize125c) Service.onr© SyncFieldAction.phC) SvncRelatedActivit127C) WebhookSvncBatclv MintearationAor> O Accessors130ConfigD DTOD FiltersD JobsProspectSearchStraW sevice lraits© DataClient.php© DecorateActivity.ph©LocalSearch.phpu Localsearchinteria© RemoteSearch.php132134135136142c) Service.phpv W Listeners© ConvertLeadActivitc) PurceLookuocache› D Metadata> Miarationa Pioedrivev Salesforce150151• D FieldsM OnnortunitvMatcheOpportunitySyncSti153M ProsneetSearchStr.154• M ServiceTraitcC) Client nhr© DecorateActivity.pt. Delete@biectsTrait© FieldDefinitions.php© PayloadBuilder.php© Profile.php© QueryBuilder.phpTests passed: 13 (today 13:02)class Cllent extends Baseclient 1mpLements Hubspotclientintertacenubu1etunction 1shubspotrateuimithrowaole se: 000lII $e instanceof \GuzzLeHttp\Exception\RequestExceptionreturn (int) $e->getCode() === 429;recurn talsepubuac function parseRetrvAfterThrowable Se: 1nt1f method existsSe.'getResponseHeaders')) {Sheaders = $e->getResponseHeaders() ?: [1;svalue = Sheadersl'Retry-After'J ?? Sheadersl'retry-after"J ?? null;if (is_array($value)) €Svalue = Svaluel0l 22 nuleif (is_numeric($value)) {return (int) $valve;Smessage = strtolower ($this->$e->getMessage()($e));if (str_contains($message, 'daily')) {if (str_contains($message, 'ten secondly')) {recurn 10if (str_contains($message, 'secondly')) {return 1Sthis->log->warning(' [Hubspot] No retry-after header or known message, using default', I'exception_class' => get_class($e),1 usagepublic function parseMessage(Throwable $e): stringHudspol/serwice.pnp| A2 A67 X3 A VM1/ 1011TII1l 111$0halPreparation for Refi... in 48m100% 58• Mon 11 May 14:12:40&console [pRODIA console (EU]A console [STAGING]E laravel.log >s\Command: :run Memory usage before starting command {"conEntitles Startind Es undate worker "oid":12650."workenlid"*"s\Command: :run Memory usage for command f{"Starting CRM data matching {"activity":te single target {"target": "activities"rch ] Entity added to Redis list {"entiParticipants old state {"activity":6150Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" :1499Generating access token. {"mode": "legagration owner matched as CRM Owner {"crmiss, calling the API {"identifier_typech contact {"email": "nikolay.nikolov@jiturned empty result, caching the miss vfter header or known message, using dei29 from API {"team_id":2, "config_id":2,secondly Limit.\", \"errorType\":\ "RATEd", "trace_id":"7954a095-b2fb-4c22-bbb6-Rate limit caught. releasina 100 withStarting CRM data matching f"activity":te single target *"target":"activities'rch ] Entity added to Redis list f"entiParticinants old state ""activitv:044Fetching token {"socialAccountId":1499,Token retrieved "socialAccountId"• 1499aration owner matched as CRM Owner "cn/ local search hit {"identifier_type":"empty resultnd APt calle +ry neyt1 Rate limit caught, releasing job withStarting CRM data matching {"activity":te single target {"target":"activities"rch ] Entity added to Redis list {"entiParticipants old state ("activity":6143Fetching token {"socialAccountId":1499,Token retrieved {"socialAccountId" : 1499Generating access token. ("mode": "Legagration owner matched as CRM Owner ("cr/ local search hit ("identifier_type":"empty result - no APT calls. try next matching method {"1 Rate limit caught. releasing iob withStarting CRM data matching {"activity",te single target {"target"."activities'rch ] Entity added to Redis list {"entiParticinants old state {"activitv".614.Fetching token {"socialAccountId"•1499)Token retrieved {"socialAccountId" :1499Generatina access token. "mode"."Leo:aration owner matched as CRM Ownen {"crbjects/contact/search' resulte...
|
18348
|
NULL
|
NULL
|
NULL
|